! function() {
	var requirejs, require, define;
	! function(undef) {
		function hasProp(obj, prop) {
			return hasOwn.call(obj, prop)
		}

		function normalize(name, baseName) {
			var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, baseParts = baseName && baseName.split("/"),
				map = config.map,
				starMap = map && map["*"] || {};
			if(name && "." === name.charAt(0))
				if(baseName) {
					for(baseParts = baseParts.slice(0, baseParts.length - 1), name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), name = baseParts.concat(name), i = 0; i < name.length; i += 1)
						if(part = name[i], "." === part) name.splice(i, 1), i -= 1;
						else if(".." === part) {
						if(1 === i && (".." === name[2] || ".." === name[0])) break;
						i > 0 && (name.splice(i - 1, 2), i -= 2)
					}
					name = name.join("/")
				} else 0 === name.indexOf("./") && (name = name.substring(2));
			if((baseParts || starMap) && map) {
				for(nameParts = name.split("/"), i = nameParts.length; i > 0; i -= 1) {
					if(nameSegment = nameParts.slice(0, i).join("/"), baseParts)
						for(j = baseParts.length; j > 0; j -= 1)
							if(mapValue = map[baseParts.slice(0, j).join("/")], mapValue && (mapValue = mapValue[nameSegment])) {
								foundMap = mapValue, foundI = i;
								break
							}
					if(foundMap) break;
					!foundStarMap && starMap && starMap[nameSegment] && (foundStarMap = starMap[nameSegment], starI = i)
				}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
			}
			return name
		}

		function makeRequire(relName, forceSync) {
			return function() {
				return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]))
			}
		}

		function makeNormalize(relName) {
			return function(name) {
				return normalize(name, relName)
			}
		}

		function makeLoad(depName) {
			return function(value) {
				defined[depName] = value
			}
		}

		function callDep(name) {
			if(hasProp(waiting, name)) {
				var args = waiting[name];
				delete waiting[name], defining[name] = !0, main.apply(undef, args)
			}
			if(!hasProp(defined, name) && !hasProp(defining, name)) throw new Error("No " + name);
			return defined[name]
		}

		function splitPrefix(name) {
			var prefix, index = name ? name.indexOf("!") : -1;
			return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
		}

		function makeConfig(name) {
			return function() {
				return config && config.config && config.config[name] || {}
			}
		}
		var main, req, makeMap, handlers, defined = {},
			waiting = {},
			config = {},
			defining = {},
			hasOwn = Object.prototype.hasOwnProperty,
			aps = [].slice,
			jsSuffixRegExp = /\.js$/;
		makeMap = function(name, relName) {
			var plugin, parts = splitPrefix(name),
				prefix = parts[0];
			return name = parts[1], prefix && (prefix = normalize(prefix, relName), plugin = callDep(prefix)), prefix ? name = plugin && plugin.normalize ? plugin.normalize(name, makeNormalize(relName)) : normalize(name, relName) : (name = normalize(name, relName), parts = splitPrefix(name), prefix = parts[0], name = parts[1], prefix && (plugin = callDep(prefix))), {
				f: prefix ? prefix + "!" + name : name,
				n: name,
				pr: prefix,
				p: plugin
			}
		}, handlers = {
			require: function(name) {
				return makeRequire(name)
			},
			exports: function(name) {
				var e = defined[name];
				return "undefined" != typeof e ? e : defined[name] = {}
			},
			module: function(name) {
				return {
					id: name,
					uri: "",
					exports: defined[name],
					config: makeConfig(name)
				}
			}
		}, main = function(name, deps, callback, relName) {
			var cjsModule, depName, ret, map, i, usingExports, args = [],
				callbackType = typeof callback;
			if(relName = relName || name, "undefined" === callbackType || "function" === callbackType) {
				for(deps = !deps.length && callback.length ? ["require", "exports", "module"] : deps, i = 0; i < deps.length; i += 1)
					if(map = makeMap(deps[i], relName), depName = map.f, "require" === depName) args[i] = handlers.require(name);
					else if("exports" === depName) args[i] = handlers.exports(name), usingExports = !0;
				else if("module" === depName) cjsModule = args[i] = handlers.module(name);
				else if(hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) args[i] = callDep(depName);
				else {
					if(!map.p) throw new Error(name + " missing " + depName);
					map.p.load(map.n, makeRequire(relName, !0), makeLoad(depName), {}), args[i] = defined[depName]
				}
				ret = callback ? callback.apply(defined[name], args) : void 0, name && (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name] ? defined[name] = cjsModule.exports : ret === undef && usingExports || (defined[name] = ret))
			} else name && (defined[name] = callback)
		}, requirejs = require = req = function(deps, callback, relName, forceSync, alt) {
			if("string" == typeof deps) return handlers[deps] ? handlers[deps](callback) : callDep(makeMap(deps, callback).f);
			if(!deps.splice) {
				if(config = deps, config.deps && req(config.deps, config.callback), !callback) return;
				callback.splice ? (deps = callback, callback = relName, relName = null) : deps = undef
			}
			return callback = callback || function() {}, "function" == typeof relName && (relName = forceSync, forceSync = alt), forceSync ? main(undef, deps, callback, relName) : setTimeout(function() {
				main(undef, deps, callback, relName)
			}, 4), req
		}, req.config = function(cfg) {
			return req(cfg)
		}, requirejs._defined = defined, define = function(name, deps, callback) {
			deps.splice || (callback = deps, deps = []), hasProp(defined, name) || hasProp(waiting, name) || (waiting[name] = [name, deps, callback])
		}, define.amd = {
			jQuery: !0
		}
	}(), define("almond", function() {}), require.config({
			paths: {
				jquery: "../bower_components/jquery/jquery",
				placeholder: "../bower_components/jquery-placeholder/jquery.placeholder"
			},
			shim: {
				jquery: {
					exports: "$"
				},
				placeholder: {
					deps: ["jquery"]
				}
			}
		}), define("config", function() {}), require(["config"], function() {
			require(["jquery", "module/login", "module/noteInvite", "util/Params", "util/Cookie", "util/CallbackHandle"], function($, login, noteInvite, params, cookie, callbackHandler) {
				"use strict";

				function onNotLogin(res) {
					var islogin = cookie.get("YNOTE_LOGIN");
					"error" == res ? $body.addClass("error") : code && !islogin ? noteInvite(code).progress(initUI).fail(onFailed) : $body.removeClass("loading")
				}

				function onLogin(trackEvent) {
					return trackEvent && window._rlog && "function" == typeof window._rlog.push && window._rlog.push(["_trackCustom", "web-signIn", [
						["login", trackEvent]
					]]), callback ? void callbackHandler.onCallback(callback) : void(window.location.href = "http://note.youdao.com")
				}

				function onFailed() {
					location.href = "/signIn/index.html" + location.search
				}

				function initUI(data) {
					return data = data || {}, (inviter = data.inviter) ? ($name.html(inviter), $body.addClass("invite"), void $body.removeClass("loading")) : void $body.removeClass("loading")
				}

				function startCount() {
					var count = 60;
					checkEl.text(count + "s 后重发"), checkEl.off("click", startCount), checkEl.removeClass("tocheck");
					var intervalCheck = function() {
						count--, 0 === count ? endCount() : (checkEl.text(count + "s 后重发"), setTimeout(intervalCheck, 1e3))
					};
					setTimeout(intervalCheck, 1e3)
				}

				function endCount() {
					checkEl.text("获取验证码"), checkEl.on("click", startCount), checkEl.addClass("tocheck")
				}
				var $body = $(document.body),
					$name = $(".login-top #invite-name"),
					code = params.get("invitation"),
					callback = params.get("callback") || params.get("back_url"),
					style = params.get("style"),
					inviter = !1;
				if(style) return void(location.href = "/signIn/" + style + ".html" + location.search);
				login().progress(onNotLogin).done(onLogin).fail(onFailed), $(".login-type").on("click", function(evt) {
					var type = $(this).data("type");
					$.each($(".login-container"), function(index, node) {
						$(node).data("container") === type ? $(node).addClass("show") : $(node).removeClass("show")
					}), $(".login-type").removeClass("selected"), $(this).addClass("selected")
				});
				var checkEl = $(".verify-code-hint");
				checkEl.on("click", startCount), $(".verify-code").on("input", function(evt) {
					$(".verify-code-checked").show()
				})
			})
		}), define("index", function() {}),
		function(window, undefined) {
			function isArraylike(obj) {
				var length = obj.length,
					type = jQuery.type(obj);
				return jQuery.isWindow(obj) ? !1 : 1 === obj.nodeType && length ? !0 : "array" === type || "function" !== type && (0 === length || "number" == typeof length && length > 0 && length - 1 in obj)
			}

			function createOptions(options) {
				var object = optionsCache[options] = {};
				return jQuery.each(options.match(core_rnotwhite) || [], function(_, flag) {
					object[flag] = !0
				}), object
			}

			function internalData(elem, name, data, pvt) {
				if(jQuery.acceptData(elem)) {
					var thisCache, ret, internalKey = jQuery.expando,
						getByName = "string" == typeof name,
						isNode = elem.nodeType,
						cache = isNode ? jQuery.cache : elem,
						id = isNode ? elem[internalKey] : elem[internalKey] && internalKey;
					if(id && cache[id] && (pvt || cache[id].data) || !getByName || data !== undefined) return id || (isNode ? elem[internalKey] = id = core_deletedIds.pop() || jQuery.guid++ : id = internalKey), cache[id] || (cache[id] = {}, isNode || (cache[id].toJSON = jQuery.noop)), ("object" == typeof name || "function" == typeof name) && (pvt ? cache[id] = jQuery.extend(cache[id], name) : cache[id].data = jQuery.extend(cache[id].data, name)), thisCache = cache[id], pvt || (thisCache.data || (thisCache.data = {}), thisCache = thisCache.data), data !== undefined && (thisCache[jQuery.camelCase(name)] = data), getByName ? (ret = thisCache[name], null == ret && (ret = thisCache[jQuery.camelCase(name)])) : ret = thisCache, ret
				}
			}

			function internalRemoveData(elem, name, pvt) {
				if(jQuery.acceptData(elem)) {
					var i, l, thisCache, isNode = elem.nodeType,
						cache = isNode ? jQuery.cache : elem,
						id = isNode ? elem[jQuery.expando] : jQuery.expando;
					if(cache[id]) {
						if(name && (thisCache = pvt ? cache[id] : cache[id].data)) {
							jQuery.isArray(name) ? name = name.concat(jQuery.map(name, jQuery.camelCase)) : name in thisCache ? name = [name] : (name = jQuery.camelCase(name), name = name in thisCache ? [name] : name.split(" "));
							for(i = 0, l = name.length; l > i; i++) delete thisCache[name[i]];
							if(!(pvt ? isEmptyDataObject : jQuery.isEmptyObject)(thisCache)) return
						}(pvt || (delete cache[id].data, isEmptyDataObject(cache[id]))) && (isNode ? jQuery.cleanData([elem], !0) : jQuery.support.deleteExpando || cache != cache.window ? delete cache[id] : cache[id] = null)
					}
				}
			}

			function dataAttr(elem, key, data) {
				if(data === undefined && 1 === elem.nodeType) {
					var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();
					if(data = elem.getAttribute(name), "string" == typeof data) {
						try {
							data = "true" === data ? !0 : "false" === data ? !1 : "null" === data ? null : +data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data
						} catch(e) {}
						jQuery.data(elem, key, data)
					} else data = undefined
				}
				return data
			}

			function isEmptyDataObject(obj) {
				var name;
				for(name in obj)
					if(("data" !== name || !jQuery.isEmptyObject(obj[name])) && "toJSON" !== name) return !1;
				return !0
			}

			function returnTrue() {
				return !0
			}

			function returnFalse() {
				return !1
			}

			function sibling(cur, dir) {
				do cur = cur[dir]; while (cur && 1 !== cur.nodeType);
				return cur
			}

			function winnow(elements, qualifier, keep) {
				if(qualifier = qualifier || 0, jQuery.isFunction(qualifier)) return jQuery.grep(elements, function(elem, i) {
					var retVal = !!qualifier.call(elem, i, elem);
					return retVal === keep
				});
				if(qualifier.nodeType) return jQuery.grep(elements, function(elem) {
					return elem === qualifier === keep
				});
				if("string" == typeof qualifier) {
					var filtered = jQuery.grep(elements, function(elem) {
						return 1 === elem.nodeType
					});
					if(isSimple.test(qualifier)) return jQuery.filter(qualifier, filtered, !keep);
					qualifier = jQuery.filter(qualifier, filtered)
				}
				return jQuery.grep(elements, function(elem) {
					return jQuery.inArray(elem, qualifier) >= 0 === keep
				})
			}

			function createSafeFragment(document) {
				var list = nodeNames.split("|"),
					safeFrag = document.createDocumentFragment();
				if(safeFrag.createElement)
					for(; list.length;) safeFrag.createElement(list.pop());
				return safeFrag
			}

			function findOrAppend(elem, tag) {
				return elem.getElementsByTagName(tag)[0] || elem.appendChild(elem.ownerDocument.createElement(tag))
			}

			function disableScript(elem) {
				var attr = elem.getAttributeNode("type");
				return elem.type = (attr && attr.specified) + "/" + elem.type, elem
			}

			function restoreScript(elem) {
				var match = rscriptTypeMasked.exec(elem.type);
				return match ? elem.type = match[1] : elem.removeAttribute("type"), elem
			}

			function setGlobalEval(elems, refElements) {
				for(var elem, i = 0; null != (elem = elems[i]); i++) jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval"))
			}

			function cloneCopyEvent(src, dest) {
				if(1 === dest.nodeType && jQuery.hasData(src)) {
					var type, i, l, oldData = jQuery._data(src),
						curData = jQuery._data(dest, oldData),
						events = oldData.events;
					if(events) {
						delete curData.handle, curData.events = {};
						for(type in events)
							for(i = 0, l = events[type].length; l > i; i++) jQuery.event.add(dest, type, events[type][i])
					}
					curData.data && (curData.data = jQuery.extend({}, curData.data))
				}
			}

			function fixCloneNodeIssues(src, dest) {
				var nodeName, e, data;
				if(1 === dest.nodeType) {
					if(nodeName = dest.nodeName.toLowerCase(), !jQuery.support.noCloneEvent && dest[jQuery.expando]) {
						data = jQuery._data(dest);
						for(e in data.events) jQuery.removeEvent(dest, e, data.handle);
						dest.removeAttribute(jQuery.expando)
					}
					"script" === nodeName && dest.text !== src.text ? (disableScript(dest).text = src.text, restoreScript(dest)) : "object" === nodeName ? (dest.parentNode && (dest.outerHTML = src.outerHTML), jQuery.support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML) && (dest.innerHTML = src.innerHTML)) : "input" === nodeName && manipulation_rcheckableType.test(src.type) ? (dest.defaultChecked = dest.checked = src.checked, dest.value !== src.value && (dest.value = src.value)) : "option" === nodeName ? dest.defaultSelected = dest.selected = src.defaultSelected : ("input" === nodeName || "textarea" === nodeName) && (dest.defaultValue = src.defaultValue)
				}
			}

			function getAll(context, tag) {
				var elems, elem, i = 0,
					found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll(tag || "*") : undefined;
				if(!found)
					for(found = [], elems = context.childNodes || context; null != (elem = elems[i]); i++) !tag || jQuery.nodeName(elem, tag) ? found.push(elem) : jQuery.merge(found, getAll(elem, tag));
				return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], found) : found
			}

			function fixDefaultChecked(elem) {
				manipulation_rcheckableType.test(elem.type) && (elem.defaultChecked = elem.checked)
			}

			function vendorPropName(style, name) {
				if(name in style) return name;
				for(var capName = name.charAt(0).toUpperCase() + name.slice(1), origName = name, i = cssPrefixes.length; i--;)
					if(name = cssPrefixes[i] + capName, name in style) return name;
				return origName
			}

			function isHidden(elem, el) {
				return elem = el || elem, "none" === jQuery.css(elem, "display") || !jQuery.contains(elem.ownerDocument, elem)
			}

			function showHide(elements, show) {
				for(var display, elem, hidden, values = [], index = 0, length = elements.length; length > index; index++) elem = elements[index], elem.style && (values[index] = jQuery._data(elem, "olddisplay"), display = elem.style.display, show ? (values[index] || "none" !== display || (elem.style.display = ""), "" === elem.style.display && isHidden(elem) && (values[index] = jQuery._data(elem, "olddisplay", css_defaultDisplay(elem.nodeName)))) : values[index] || (hidden = isHidden(elem), (display && "none" !== display || !hidden) && jQuery._data(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display"))));
				for(index = 0; length > index; index++) elem = elements[index], elem.style && (show && "none" !== elem.style.display && "" !== elem.style.display || (elem.style.display = show ? values[index] || "" : "none"));
				return elements
			}

			function setPositiveNumber(elem, value, subtract) {
				var matches = rnumsplit.exec(value);
				return matches ? Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value
			}

			function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
				for(var i = extra === (isBorderBox ? "border" : "content") ? 4 : "width" === name ? 1 : 0, val = 0; 4 > i; i += 2) "margin" === extra && (val += jQuery.css(elem, extra + cssExpand[i], !0, styles)), isBorderBox ? ("content" === extra && (val -= jQuery.css(elem, "padding" + cssExpand[i], !0, styles)), "margin" !== extra && (val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", !0, styles))) : (val += jQuery.css(elem, "padding" + cssExpand[i], !0, styles), "padding" !== extra && (val += jQuery.css(elem, "border" + cssExpand[i] + "Width", !0, styles)));
				return val
			}

			function getWidthOrHeight(elem, name, extra) {
				var valueIsBorderBox = !0,
					val = "width" === name ? elem.offsetWidth : elem.offsetHeight,
					styles = getStyles(elem),
					isBorderBox = jQuery.support.boxSizing && "border-box" === jQuery.css(elem, "boxSizing", !1, styles);
				if(0 >= val || null == val) {
					if(val = curCSS(elem, name, styles), (0 > val || null == val) && (val = elem.style[name]), rnumnonpx.test(val)) return val;
					valueIsBorderBox = isBorderBox && (jQuery.support.boxSizingReliable || val === elem.style[name]), val = parseFloat(val) || 0
				}
				return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px"
			}

			function css_defaultDisplay(nodeName) {
				var doc = document,
					display = elemdisplay[nodeName];
				return display || (display = actualDisplay(nodeName, doc), "none" !== display && display || (iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>").css("cssText", "display:block !important")).appendTo(doc.documentElement), doc = (iframe[0].contentWindow || iframe[0].contentDocument).document, doc.write("<!doctype html><html><body>"), doc.close(), display = actualDisplay(nodeName, doc), iframe.detach()), elemdisplay[nodeName] = display), display
			}

			function actualDisplay(name, doc) {
				var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
					display = jQuery.css(elem[0], "display");
				return elem.remove(), display
			}

			function buildParams(prefix, obj, traditional, add) {
				var name;
				if(jQuery.isArray(obj)) jQuery.each(obj, function(i, v) {
					traditional || rbracket.test(prefix) ? add(prefix, v) : buildParams(prefix + "[" + ("object" == typeof v ? i : "") + "]", v, traditional, add)
				});
				else if(traditional || "object" !== jQuery.type(obj)) add(prefix, obj);
				else
					for(name in obj) buildParams(prefix + "[" + name + "]", obj[name], traditional, add)
			}

			function addToPrefiltersOrTransports(structure) {
				return function(dataTypeExpression, func) {
					"string" != typeof dataTypeExpression && (func = dataTypeExpression, dataTypeExpression = "*");
					var dataType, i = 0,
						dataTypes = dataTypeExpression.toLowerCase().match(core_rnotwhite) || [];
					if(jQuery.isFunction(func))
						for(; dataType = dataTypes[i++];) "+" === dataType[0] ? (dataType = dataType.slice(1) || "*", (structure[dataType] = structure[dataType] || []).unshift(func)) : (structure[dataType] = structure[dataType] || []).push(func)
				}
			}

			function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
				function inspect(dataType) {
					var selected;
					return inspected[dataType] = !0, jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
						var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
						return "string" != typeof dataTypeOrTransport || seekingTransport || inspected[dataTypeOrTransport] ? seekingTransport ? !(selected = dataTypeOrTransport) : void 0 : (options.dataTypes.unshift(dataTypeOrTransport), inspect(dataTypeOrTransport), !1)
					}), selected
				}
				var inspected = {},
					seekingTransport = structure === transports;
				return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*")
			}

			function ajaxExtend(target, src) {
				var deep, key, flatOptions = jQuery.ajaxSettings.flatOptions || {};
				for(key in src) src[key] !== undefined && ((flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]);
				return deep && jQuery.extend(!0, target, deep), target
			}

			function ajaxHandleResponses(s, jqXHR, responses) {
				var firstDataType, ct, finalDataType, type, contents = s.contents,
					dataTypes = s.dataTypes,
					responseFields = s.responseFields;
				for(type in responseFields) type in responses && (jqXHR[responseFields[type]] = responses[type]);
				for(;
					"*" === dataTypes[0];) dataTypes.shift(), ct === undefined && (ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"));
				if(ct)
					for(type in contents)
						if(contents[type] && contents[type].test(ct)) {
							dataTypes.unshift(type);
							break
						}
				if(dataTypes[0] in responses) finalDataType = dataTypes[0];
				else {
					for(type in responses) {
						if(!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
							finalDataType = type;
							break
						}
						firstDataType || (firstDataType = type)
					}
					finalDataType = finalDataType || firstDataType
				}
				return finalDataType ? (finalDataType !== dataTypes[0] && dataTypes.unshift(finalDataType), responses[finalDataType]) : void 0
			}

			function ajaxConvert(s, response) {
				var conv2, current, conv, tmp, converters = {},
					i = 0,
					dataTypes = s.dataTypes.slice(),
					prev = dataTypes[0];
				if(s.dataFilter && (response = s.dataFilter(response, s.dataType)), dataTypes[1])
					for(conv in s.converters) converters[conv.toLowerCase()] = s.converters[conv];
				for(; current = dataTypes[++i];)
					if("*" !== current) {
						if("*" !== prev && prev !== current) {
							if(conv = converters[prev + " " + current] || converters["* " + current], !conv)
								for(conv2 in converters)
									if(tmp = conv2.split(" "), tmp[1] === current && (conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]])) {
										conv === !0 ? conv = converters[conv2] : converters[conv2] !== !0 && (current = tmp[0], dataTypes.splice(i--, 0, current));
										break
									}
							if(conv !== !0)
								if(conv && s["throws"]) response = conv(response);
								else try {
									response = conv(response)
								} catch(e) {
									return {
										state: "parsererror",
										error: conv ? e : "No conversion from " + prev + " to " + current
									}
								}
						}
						prev = current
					}
				return {
					state: "success",
					data: response
				}
			}

			function createStandardXHR() {
				try {
					return new window.XMLHttpRequest
				} catch(e) {}
			}

			function createActiveXHR() {
				try {
					return new window.ActiveXObject("Microsoft.XMLHTTP")
				} catch(e) {}
			}

			function createFxNow() {
				return setTimeout(function() {
					fxNow = undefined
				}), fxNow = jQuery.now()
			}

			function createTweens(animation, props) {
				jQuery.each(props, function(prop, value) {
					for(var collection = (tweeners[prop] || []).concat(tweeners["*"]), index = 0, length = collection.length; length > index; index++)
						if(collection[index].call(animation, prop, value)) return
				})
			}

			function Animation(elem, properties, options) {
				var result, stopped, index = 0,
					length = animationPrefilters.length,
					deferred = jQuery.Deferred().always(function() {
						delete tick.elem
					}),
					tick = function() {
						if(stopped) return !1;
						for(var currentTime = fxNow || createFxNow(), remaining = Math.max(0, animation.startTime + animation.duration - currentTime), temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; length > index; index++) animation.tweens[index].run(percent);
						return deferred.notifyWith(elem, [animation, percent, remaining]), 1 > percent && length ? remaining : (deferred.resolveWith(elem, [animation]), !1)
					},
					animation = deferred.promise({
						elem: elem,
						props: jQuery.extend({}, properties),
						opts: jQuery.extend(!0, {
							specialEasing: {}
						}, options),
						originalProperties: properties,
						originalOptions: options,
						startTime: fxNow || createFxNow(),
						duration: options.duration,
						tweens: [],
						createTween: function(prop, end) {
							var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
							return animation.tweens.push(tween), tween
						},
						stop: function(gotoEnd) {
							var index = 0,
								length = gotoEnd ? animation.tweens.length : 0;
							if(stopped) return this;
							for(stopped = !0; length > index; index++) animation.tweens[index].run(1);
							return gotoEnd ? deferred.resolveWith(elem, [animation, gotoEnd]) : deferred.rejectWith(elem, [animation, gotoEnd]), this
						}
					}),
					props = animation.props;
				for(propFilter(props, animation.opts.specialEasing); length > index; index++)
					if(result = animationPrefilters[index].call(animation, elem, props, animation.opts)) return result;
				return createTweens(animation, props), jQuery.isFunction(animation.opts.start) && animation.opts.start.call(elem, animation), jQuery.fx.timer(jQuery.extend(tick, {
					elem: elem,
					anim: animation,
					queue: animation.opts.queue
				})), animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)
			}

			function propFilter(props, specialEasing) {
				var value, name, index, easing, hooks;
				for(index in props)
					if(name = jQuery.camelCase(index), easing = specialEasing[name], value = props[index], jQuery.isArray(value) && (easing = value[1], value = props[index] = value[0]), index !== name && (props[name] = value, delete props[index]), hooks = jQuery.cssHooks[name], hooks && "expand" in hooks) {
						value = hooks.expand(value), delete props[name];
						for(index in value) index in props || (props[index] = value[index], specialEasing[index] = easing)
					} else specialEasing[name] = easing
			}

			function defaultPrefilter(elem, props, opts) {
				var prop, index, length, value, dataShow, toggle, tween, hooks, oldfire, anim = this,
					style = elem.style,
					orig = {},
					handled = [],
					hidden = elem.nodeType && isHidden(elem);
				opts.queue || (hooks = jQuery._queueHooks(elem, "fx"), null == hooks.unqueued && (hooks.unqueued = 0, oldfire = hooks.empty.fire, hooks.empty.fire = function() {
					hooks.unqueued || oldfire()
				}), hooks.unqueued++, anim.always(function() {
					anim.always(function() {
						hooks.unqueued--, jQuery.queue(elem, "fx").length || hooks.empty.fire()
					})
				})), 1 === elem.nodeType && ("height" in props || "width" in props) && (opts.overflow = [style.overflow, style.overflowX, style.overflowY], "inline" === jQuery.css(elem, "display") && "none" === jQuery.css(elem, "float") && (jQuery.support.inlineBlockNeedsLayout && "inline" !== css_defaultDisplay(elem.nodeName) ? style.zoom = 1 : style.display = "inline-block")), opts.overflow && (style.overflow = "hidden", jQuery.support.shrinkWrapBlocks || anim.always(function() {
					style.overflow = opts.overflow[0], style.overflowX = opts.overflow[1], style.overflowY = opts.overflow[2]
				}));
				for(index in props)
					if(value = props[index], rfxtypes.exec(value)) {
						if(delete props[index], toggle = toggle || "toggle" === value, value === (hidden ? "hide" : "show")) continue;
						handled.push(index)
					}
				if(length = handled.length) {
					dataShow = jQuery._data(elem, "fxshow") || jQuery._data(elem, "fxshow", {}), "hidden" in dataShow && (hidden = dataShow.hidden), toggle && (dataShow.hidden = !hidden), hidden ? jQuery(elem).show() : anim.done(function() {
						jQuery(elem).hide()
					}), anim.done(function() {
						var prop;
						jQuery._removeData(elem, "fxshow");
						for(prop in orig) jQuery.style(elem, prop, orig[prop])
					});
					for(index = 0; length > index; index++) prop = handled[index], tween = anim.createTween(prop, hidden ? dataShow[prop] : 0), orig[prop] = dataShow[prop] || jQuery.style(elem, prop), prop in dataShow || (dataShow[prop] = tween.start, hidden && (tween.end = tween.start, tween.start = "width" === prop || "height" === prop ? 1 : 0))
				}
			}

			function Tween(elem, options, prop, end, easing) {
				return new Tween.prototype.init(elem, options, prop, end, easing)
			}

			function genFx(type, includeWidth) {
				var which, attrs = {
						height: type
					},
					i = 0;
				for(includeWidth = includeWidth ? 1 : 0; 4 > i; i += 2 - includeWidth) which = cssExpand[i], attrs["margin" + which] = attrs["padding" + which] = type;
				return includeWidth && (attrs.opacity = attrs.width = type), attrs
			}

			function getWindow(elem) {
				return jQuery.isWindow(elem) ? elem : 9 === elem.nodeType ? elem.defaultView || elem.parentWindow : !1
			}
			var readyList, rootjQuery, core_strundefined = typeof undefined,
				document = window.document,
				location = window.location,
				_jQuery = window.jQuery,
				_$ = window.$,
				class2type = {},
				core_deletedIds = [],
				core_version = "1.9.1",
				core_concat = core_deletedIds.concat,
				core_push = core_deletedIds.push,
				core_slice = core_deletedIds.slice,
				core_indexOf = core_deletedIds.indexOf,
				core_toString = class2type.toString,
				core_hasOwn = class2type.hasOwnProperty,
				core_trim = core_version.trim,
				jQuery = function(selector, context) {
					return new jQuery.fn.init(selector, context, rootjQuery)
				},
				core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
				core_rnotwhite = /\S+/g,
				rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
				rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
				rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
				rvalidchars = /^[\],:{}\s]*$/,
				rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
				rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
				rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
				rmsPrefix = /^-ms-/,
				rdashAlpha = /-([\da-z])/gi,
				fcamelCase = function(all, letter) {
					return letter.toUpperCase()
				},
				completed = function(event) {
					(document.addEventListener || "load" === event.type || "complete" === document.readyState) && (detach(), jQuery.ready())
				},
				detach = function() {
					document.addEventListener ? (document.removeEventListener("DOMContentLoaded", completed, !1), window.removeEventListener("load", completed, !1)) : (document.detachEvent("onreadystatechange", completed), window.detachEvent("onload", completed))
				};
			jQuery.fn = jQuery.prototype = {
				jquery: core_version,
				constructor: jQuery,
				init: function(selector, context, rootjQuery) {
					var match, elem;
					if(!selector) return this;
					if("string" == typeof selector) {
						if(match = "<" === selector.charAt(0) && ">" === selector.charAt(selector.length - 1) && selector.length >= 3 ? [null, selector, null] : rquickExpr.exec(selector), !match || !match[1] && context) return !context || context.jquery ? (context || rootjQuery).find(selector) : this.constructor(context).find(selector);
						if(match[1]) {
							if(context = context instanceof jQuery ? context[0] : context, jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, !0)), rsingleTag.test(match[1]) && jQuery.isPlainObject(context))
								for(match in context) jQuery.isFunction(this[match]) ? this[match](context[match]) : this.attr(match, context[match]);
							return this
						}
						if(elem = document.getElementById(match[2]), elem && elem.parentNode) {
							if(elem.id !== match[2]) return rootjQuery.find(selector);
							this.length = 1, this[0] = elem
						}
						return this.context = document, this.selector = selector, this
					}
					return selector.nodeType ? (this.context = this[0] = selector, this.length = 1, this) : jQuery.isFunction(selector) ? rootjQuery.ready(selector) : (selector.selector !== undefined && (this.selector = selector.selector, this.context = selector.context), jQuery.makeArray(selector, this))
				},
				selector: "",
				length: 0,
				size: function() {
					return this.length
				},
				toArray: function() {
					return core_slice.call(this)
				},
				get: function(num) {
					return null == num ? this.toArray() : 0 > num ? this[this.length + num] : this[num]
				},
				pushStack: function(elems) {
					var ret = jQuery.merge(this.constructor(), elems);
					return ret.prevObject = this, ret.context = this.context, ret
				},
				each: function(callback, args) {
					return jQuery.each(this, callback, args)
				},
				ready: function(fn) {
					return jQuery.ready.promise().done(fn), this
				},
				slice: function() {
					return this.pushStack(core_slice.apply(this, arguments))
				},
				first: function() {
					return this.eq(0)
				},
				last: function() {
					return this.eq(-1)
				},
				eq: function(i) {
					var len = this.length,
						j = +i + (0 > i ? len : 0);
					return this.pushStack(j >= 0 && len > j ? [this[j]] : [])
				},
				map: function(callback) {
					return this.pushStack(jQuery.map(this, function(elem, i) {
						return callback.call(elem, i, elem)
					}))
				},
				end: function() {
					return this.prevObject || this.constructor(null)
				},
				push: core_push,
				sort: [].sort,
				splice: [].splice
			}, jQuery.fn.init.prototype = jQuery.fn, jQuery.extend = jQuery.fn.extend = function() {
				var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {},
					i = 1,
					length = arguments.length,
					deep = !1;
				for("boolean" == typeof target && (deep = target, target = arguments[1] || {}, i = 2), "object" == typeof target || jQuery.isFunction(target) || (target = {}), length === i && (target = this, --i); length > i; i++)
					if(null != (options = arguments[i]))
						for(name in options) src = target[name], copy = options[name], target !== copy && (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))) ? (copyIsArray ? (copyIsArray = !1, clone = src && jQuery.isArray(src) ? src : []) : clone = src && jQuery.isPlainObject(src) ? src : {}, target[name] = jQuery.extend(deep, clone, copy)) : copy !== undefined && (target[name] = copy));
				return target
			}, jQuery.extend({
				noConflict: function(deep) {
					return window.$ === jQuery && (window.$ = _$), deep && window.jQuery === jQuery && (window.jQuery = _jQuery), jQuery
				},
				isReady: !1,
				readyWait: 1,
				holdReady: function(hold) {
					hold ? jQuery.readyWait++ : jQuery.ready(!0)
				},
				ready: function(wait) {
					if(wait === !0 ? !--jQuery.readyWait : !jQuery.isReady) {
						if(!document.body) return setTimeout(jQuery.ready);
						jQuery.isReady = !0, wait !== !0 && --jQuery.readyWait > 0 || (readyList.resolveWith(document, [jQuery]), jQuery.fn.trigger && jQuery(document).trigger("ready").off("ready"))
					}
				},
				isFunction: function(obj) {
					return "function" === jQuery.type(obj)
				},
				isArray: Array.isArray || function(obj) {
					return "array" === jQuery.type(obj)
				},
				isWindow: function(obj) {
					return null != obj && obj == obj.window
				},
				isNumeric: function(obj) {
					return !isNaN(parseFloat(obj)) && isFinite(obj)
				},
				type: function(obj) {
					return null == obj ? String(obj) : "object" == typeof obj || "function" == typeof obj ? class2type[core_toString.call(obj)] || "object" : typeof obj
				},
				isPlainObject: function(obj) {
					if(!obj || "object" !== jQuery.type(obj) || obj.nodeType || jQuery.isWindow(obj)) return !1;
					try {
						if(obj.constructor && !core_hasOwn.call(obj, "constructor") && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) return !1
					} catch(e) {
						return !1
					}
					var key;
					for(key in obj);
					return key === undefined || core_hasOwn.call(obj, key)
				},
				isEmptyObject: function(obj) {
					var name;
					for(name in obj) return !1;
					return !0
				},
				error: function(msg) {
					throw new Error(msg)
				},
				parseHTML: function(data, context, keepScripts) {
					if(!data || "string" != typeof data) return null;
					"boolean" == typeof context && (keepScripts = context, context = !1), context = context || document;
					var parsed = rsingleTag.exec(data),
						scripts = !keepScripts && [];
					return parsed ? [context.createElement(parsed[1])] : (parsed = jQuery.buildFragment([data], context, scripts), scripts && jQuery(scripts).remove(), jQuery.merge([], parsed.childNodes))
				},
				parseJSON: function(data) {
					return window.JSON && window.JSON.parse ? window.JSON.parse(data) : null === data ? data : "string" == typeof data && (data = jQuery.trim(data), data && rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) ? new Function("return " + data)() : void jQuery.error("Invalid JSON: " + data)
				},
				parseXML: function(data) {
					var xml, tmp;
					if(!data || "string" != typeof data) return null;
					try {
						window.DOMParser ? (tmp = new DOMParser, xml = tmp.parseFromString(data, "text/xml")) : (xml = new ActiveXObject("Microsoft.XMLDOM"), xml.async = "false", xml.loadXML(data))
					} catch(e) {
						xml = undefined
					}
					return xml && xml.documentElement && !xml.getElementsByTagName("parsererror").length || jQuery.error("Invalid XML: " + data), xml
				},
				noop: function() {},
				globalEval: function(data) {
					data && jQuery.trim(data) && (window.execScript || function(data) {
						window.eval.call(window, data)
					})(data)
				},
				camelCase: function(string) {
					return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase)
				},
				nodeName: function(elem, name) {
					return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase()
				},
				each: function(obj, callback, args) {
					var value, i = 0,
						length = obj.length,
						isArray = isArraylike(obj);
					if(args) {
						if(isArray)
							for(; length > i && (value = callback.apply(obj[i], args), value !== !1); i++);
						else
							for(i in obj)
								if(value = callback.apply(obj[i], args), value === !1) break
					} else if(isArray)
						for(; length > i && (value = callback.call(obj[i], i, obj[i]), value !== !1); i++);
					else
						for(i in obj)
							if(value = callback.call(obj[i], i, obj[i]), value === !1) break;
					return obj
				},
				trim: core_trim && !core_trim.call("\ufeff ") ? function(text) {
					return null == text ? "" : core_trim.call(text)
				} : function(text) {
					return null == text ? "" : (text + "").replace(rtrim, "")
				},
				makeArray: function(arr, results) {
					var ret = results || [];
					return null != arr && (isArraylike(Object(arr)) ? jQuery.merge(ret, "string" == typeof arr ? [arr] : arr) : core_push.call(ret, arr)), ret
				},
				inArray: function(elem, arr, i) {
					var len;
					if(arr) {
						if(core_indexOf) return core_indexOf.call(arr, elem, i);
						for(len = arr.length, i = i ? 0 > i ? Math.max(0, len + i) : i : 0; len > i; i++)
							if(i in arr && arr[i] === elem) return i
					}
					return -1
				},
				merge: function(first, second) {
					var l = second.length,
						i = first.length,
						j = 0;
					if("number" == typeof l)
						for(; l > j; j++) first[i++] = second[j];
					else
						for(; second[j] !== undefined;) first[i++] = second[j++];
					return first.length = i, first
				},
				grep: function(elems, callback, inv) {
					var retVal, ret = [],
						i = 0,
						length = elems.length;
					for(inv = !!inv; length > i; i++) retVal = !!callback(elems[i], i), inv !== retVal && ret.push(elems[i]);
					return ret
				},
				map: function(elems, callback, arg) {
					var value, i = 0,
						length = elems.length,
						isArray = isArraylike(elems),
						ret = [];
					if(isArray)
						for(; length > i; i++) value = callback(elems[i], i, arg), null != value && (ret[ret.length] = value);
					else
						for(i in elems) value = callback(elems[i], i, arg), null != value && (ret[ret.length] = value);
					return core_concat.apply([], ret)
				},
				guid: 1,
				proxy: function(fn, context) {
					var args, proxy, tmp;
					return "string" == typeof context && (tmp = fn[context], context = fn, fn = tmp), jQuery.isFunction(fn) ? (args = core_slice.call(arguments, 2), proxy = function() {
						return fn.apply(context || this, args.concat(core_slice.call(arguments)))
					}, proxy.guid = fn.guid = fn.guid || jQuery.guid++, proxy) : undefined
				},
				access: function(elems, fn, key, value, chainable, emptyGet, raw) {
					var i = 0,
						length = elems.length,
						bulk = null == key;
					if("object" === jQuery.type(key)) {
						chainable = !0;
						for(i in key) jQuery.access(elems, fn, i, key[i], !0, emptyGet, raw)
					} else if(value !== undefined && (chainable = !0, jQuery.isFunction(value) || (raw = !0), bulk && (raw ? (fn.call(elems, value), fn = null) : (bulk = fn, fn = function(elem, key, value) {
							return bulk.call(jQuery(elem), value)
						})), fn))
						for(; length > i; i++) fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
					return chainable ? elems : bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet
				},
				now: function() {
					return(new Date).getTime()
				}
			}), jQuery.ready.promise = function(obj) {
				if(!readyList)
					if(readyList = jQuery.Deferred(), "complete" === document.readyState) setTimeout(jQuery.ready);
					else if(document.addEventListener) document.addEventListener("DOMContentLoaded", completed, !1), window.addEventListener("load", completed, !1);
				else {
					document.attachEvent("onreadystatechange", completed), window.attachEvent("onload", completed);
					var top = !1;
					try {
						top = null == window.frameElement && document.documentElement
					} catch(e) {}
					top && top.doScroll && ! function doScrollCheck() {
						if(!jQuery.isReady) {
							try {
								top.doScroll("left")
							} catch(e) {
								return setTimeout(doScrollCheck, 50)
							}
							detach(), jQuery.ready()
						}
					}()
				}
				return readyList.promise(obj)
			}, jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
				class2type["[object " + name + "]"] = name.toLowerCase()
			}), rootjQuery = jQuery(document);
			var optionsCache = {};
			jQuery.Callbacks = function(options) {
				options = "string" == typeof options ? optionsCache[options] || createOptions(options) : jQuery.extend({}, options);
				var firing, memory, fired, firingLength, firingIndex, firingStart, list = [],
					stack = !options.once && [],
					fire = function(data) {
						for(memory = options.memory && data, fired = !0, firingIndex = firingStart || 0, firingStart = 0, firingLength = list.length, firing = !0; list && firingLength > firingIndex; firingIndex++)
							if(list[firingIndex].apply(data[0], data[1]) === !1 && options.stopOnFalse) {
								memory = !1;
								break
							}
						firing = !1, list && (stack ? stack.length && fire(stack.shift()) : memory ? list = [] : self.disable())
					},
					self = {
						add: function() {
							if(list) {
								var start = list.length;
								! function add(args) {
									jQuery.each(args, function(_, arg) {
										var type = jQuery.type(arg);
										"function" === type ? options.unique && self.has(arg) || list.push(arg) : arg && arg.length && "string" !== type && add(arg)
									})
								}(arguments), firing ? firingLength = list.length : memory && (firingStart = start, fire(memory))
							}
							return this
						},
						remove: function() {
							return list && jQuery.each(arguments, function(_, arg) {
								for(var index;
									(index = jQuery.inArray(arg, list, index)) > -1;) list.splice(index, 1), firing && (firingLength >= index && firingLength--, firingIndex >= index && firingIndex--)
							}), this
						},
						has: function(fn) {
							return fn ? jQuery.inArray(fn, list) > -1 : !(!list || !list.length)
						},
						empty: function() {
							return list = [], this
						},
						disable: function() {
							return list = stack = memory = undefined, this
						},
						disabled: function() {
							return !list
						},
						lock: function() {
							return stack = undefined, memory || self.disable(), this
						},
						locked: function() {
							return !stack
						},
						fireWith: function(context, args) {
							return args = args || [], args = [context, args.slice ? args.slice() : args], !list || fired && !stack || (firing ? stack.push(args) : fire(args)), this
						},
						fire: function() {
							return self.fireWith(this, arguments), this
						},
						fired: function() {
							return !!fired
						}
					};
				return self
			}, jQuery.extend({
				Deferred: function(func) {
					var tuples = [
							["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],
							["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],
							["notify", "progress", jQuery.Callbacks("memory")]
						],
						state = "pending",
						promise = {
							state: function() {
								return state
							},
							always: function() {
								return deferred.done(arguments).fail(arguments), this
							},
							then: function() {
								var fns = arguments;
								return jQuery.Deferred(function(newDefer) {
									jQuery.each(tuples, function(i, tuple) {
										var action = tuple[0],
											fn = jQuery.isFunction(fns[i]) && fns[i];
										deferred[tuple[1]](function() {
											var returned = fn && fn.apply(this, arguments);
											returned && jQuery.isFunction(returned.promise) ? returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify) : newDefer[action + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments)
										})
									}), fns = null
								}).promise()
							},
							promise: function(obj) {
								return null != obj ? jQuery.extend(obj, promise) : promise
							}
						},
						deferred = {};
					return promise.pipe = promise.then, jQuery.each(tuples, function(i, tuple) {
						var list = tuple[2],
							stateString = tuple[3];
						promise[tuple[1]] = list.add, stateString && list.add(function() {
							state = stateString
						}, tuples[1 ^ i][2].disable, tuples[2][2].lock), deferred[tuple[0]] = function() {
							return deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments), this
						}, deferred[tuple[0] + "With"] = list.fireWith
					}), promise.promise(deferred), func && func.call(deferred, deferred), deferred
				},
				when: function(subordinate) {
					var progressValues, progressContexts, resolveContexts, i = 0,
						resolveValues = core_slice.call(arguments),
						length = resolveValues.length,
						remaining = 1 !== length || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,
						deferred = 1 === remaining ? subordinate : jQuery.Deferred(),
						updateFunc = function(i, contexts, values) {
							return function(value) {
								contexts[i] = this, values[i] = arguments.length > 1 ? core_slice.call(arguments) : value, values === progressValues ? deferred.notifyWith(contexts, values) : --remaining || deferred.resolveWith(contexts, values)
							}
						};
					if(length > 1)
						for(progressValues = new Array(length), progressContexts = new Array(length), resolveContexts = new Array(length); length > i; i++) resolveValues[i] && jQuery.isFunction(resolveValues[i].promise) ? resolveValues[i].promise().done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFunc(i, progressContexts, progressValues)) : --remaining;
					return remaining || deferred.resolveWith(resolveContexts, resolveValues), deferred.promise()
				}
			}), jQuery.support = function() {
				var support, all, a, input, select, fragment, opt, eventName, isSupported, i, div = document.createElement("div");
				if(div.setAttribute("className", "t"), div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", all = div.getElementsByTagName("*"), a = div.getElementsByTagName("a")[0], !all || !a || !all.length) return {};
				select = document.createElement("select"), opt = select.appendChild(document.createElement("option")), input = div.getElementsByTagName("input")[0], a.style.cssText = "top:1px;float:left;opacity:.5", support = {
					getSetAttribute: "t" !== div.className,
					leadingWhitespace: 3 === div.firstChild.nodeType,
					tbody: !div.getElementsByTagName("tbody").length,
					htmlSerialize: !!div.getElementsByTagName("link").length,
					style: /top/.test(a.getAttribute("style")),
					hrefNormalized: "/a" === a.getAttribute("href"),
					opacity: /^0.5/.test(a.style.opacity),
					cssFloat: !!a.style.cssFloat,
					checkOn: !!input.value,
					optSelected: opt.selected,
					enctype: !!document.createElement("form").enctype,
					html5Clone: "<:nav></:nav>" !== document.createElement("nav").cloneNode(!0).outerHTML,
					boxModel: "CSS1Compat" === document.compatMode,
					deleteExpando: !0,
					noCloneEvent: !0,
					inlineBlockNeedsLayout: !1,
					shrinkWrapBlocks: !1,
					reliableMarginRight: !0,
					boxSizingReliable: !0,
					pixelPosition: !1
				}, input.checked = !0, support.noCloneChecked = input.cloneNode(!0).checked, select.disabled = !0, support.optDisabled = !opt.disabled;
				try {
					delete div.test
				} catch(e) {
					support.deleteExpando = !1
				}
				input = document.createElement("input"), input.setAttribute("value", ""), support.input = "" === input.getAttribute("value"), input.value = "t", input.setAttribute("type", "radio"), support.radioValue = "t" === input.value, input.setAttribute("checked", "t"), input.setAttribute("name", "t"), fragment = document.createDocumentFragment(), fragment.appendChild(input), support.appendChecked = input.checked, support.checkClone = fragment.cloneNode(!0).cloneNode(!0).lastChild.checked, div.attachEvent && (div.attachEvent("onclick", function() {
					support.noCloneEvent = !1
				}), div.cloneNode(!0).click());
				for(i in {
						submit: !0,
						change: !0,
						focusin: !0
					}) div.setAttribute(eventName = "on" + i, "t"), support[i + "Bubbles"] = eventName in window || div.attributes[eventName].expando === !1;
				return div.style.backgroundClip = "content-box", div.cloneNode(!0).style.backgroundClip = "", support.clearCloneStyle = "content-box" === div.style.backgroundClip, jQuery(function() {
					var container, marginDiv, tds, divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
						body = document.getElementsByTagName("body")[0];
					body && (container = document.createElement("div"), container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", body.appendChild(container).appendChild(div), div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>", tds = div.getElementsByTagName("td"), tds[0].style.cssText = "padding:0;margin:0;border:0;display:none", isSupported = 0 === tds[0].offsetHeight, tds[0].style.display = "", tds[1].style.display = "none", support.reliableHiddenOffsets = isSupported && 0 === tds[0].offsetHeight, div.innerHTML = "", div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", support.boxSizing = 4 === div.offsetWidth, support.doesNotIncludeMarginInBodyOffset = 1 !== body.offsetTop, window.getComputedStyle && (support.pixelPosition = "1%" !== (window.getComputedStyle(div, null) || {}).top, support.boxSizingReliable = "4px" === (window.getComputedStyle(div, null) || {
						width: "4px"
					}).width, marginDiv = div.appendChild(document.createElement("div")), marginDiv.style.cssText = div.style.cssText = divReset, marginDiv.style.marginRight = marginDiv.style.width = "0", div.style.width = "1px", support.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight)), typeof div.style.zoom !== core_strundefined && (div.innerHTML = "", div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1", support.inlineBlockNeedsLayout = 3 === div.offsetWidth, div.style.display = "block", div.innerHTML = "<div></div>", div.firstChild.style.width = "5px", support.shrinkWrapBlocks = 3 !== div.offsetWidth, support.inlineBlockNeedsLayout && (body.style.zoom = 1)), body.removeChild(container), container = div = tds = marginDiv = null)
				}), all = select = fragment = opt = a = input = null, support
			}();
			var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
				rmultiDash = /([A-Z])/g;
			jQuery.extend({
				cache: {},
				expando: "jQuery" + (core_version + Math.random()).replace(/\D/g, ""),
				noData: {
					embed: !0,
					object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
					applet: !0
				},
				hasData: function(elem) {
					return elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando], !!elem && !isEmptyDataObject(elem)
				},
				data: function(elem, name, data) {
					return internalData(elem, name, data)
				},
				removeData: function(elem, name) {
					return internalRemoveData(elem, name)
				},
				_data: function(elem, name, data) {
					return internalData(elem, name, data, !0)
				},
				_removeData: function(elem, name) {
					return internalRemoveData(elem, name, !0)
				},
				acceptData: function(elem) {
					if(elem.nodeType && 1 !== elem.nodeType && 9 !== elem.nodeType) return !1;
					var noData = elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()];
					return !noData || noData !== !0 && elem.getAttribute("classid") === noData
				}
			}), jQuery.fn.extend({
				data: function(key, value) {
					var attrs, name, elem = this[0],
						i = 0,
						data = null;
					if(key === undefined) {
						if(this.length && (data = jQuery.data(elem), 1 === elem.nodeType && !jQuery._data(elem, "parsedAttrs"))) {
							for(attrs = elem.attributes; i < attrs.length; i++) name = attrs[i].name, name.indexOf("data-") || (name = jQuery.camelCase(name.slice(5)), dataAttr(elem, name, data[name]));
							jQuery._data(elem, "parsedAttrs", !0)
						}
						return data
					}
					return "object" == typeof key ? this.each(function() {
						jQuery.data(this, key)
					}) : jQuery.access(this, function(value) {
						return value === undefined ? elem ? dataAttr(elem, key, jQuery.data(elem, key)) : null : void this.each(function() {
							jQuery.data(this, key, value)
						})
					}, null, value, arguments.length > 1, null, !0)
				},
				removeData: function(key) {
					return this.each(function() {
						jQuery.removeData(this, key)
					})
				}
			}), jQuery.extend({
				queue: function(elem, type, data) {
					var queue;
					return elem ? (type = (type || "fx") + "queue", queue = jQuery._data(elem, type), data && (!queue || jQuery.isArray(data) ? queue = jQuery._data(elem, type, jQuery.makeArray(data)) : queue.push(data)), queue || []) : void 0
				},
				dequeue: function(elem, type) {
					type = type || "fx";
					var queue = jQuery.queue(elem, type),
						startLength = queue.length,
						fn = queue.shift(),
						hooks = jQuery._queueHooks(elem, type),
						next = function() {
							jQuery.dequeue(elem, type)
						};
					"inprogress" === fn && (fn = queue.shift(), startLength--), hooks.cur = fn, fn && ("fx" === type && queue.unshift("inprogress"), delete hooks.stop, fn.call(elem, next, hooks)), !startLength && hooks && hooks.empty.fire()
				},
				_queueHooks: function(elem, type) {
					var key = type + "queueHooks";
					return jQuery._data(elem, key) || jQuery._data(elem, key, {
						empty: jQuery.Callbacks("once memory").add(function() {
							jQuery._removeData(elem, type + "queue"), jQuery._removeData(elem, key)
						})
					})
				}
			}), jQuery.fn.extend({
				queue: function(type, data) {
					var setter = 2;
					return "string" != typeof type && (data = type, type = "fx", setter--), arguments.length < setter ? jQuery.queue(this[0], type) : data === undefined ? this : this.each(function() {
						var queue = jQuery.queue(this, type, data);
						jQuery._queueHooks(this, type), "fx" === type && "inprogress" !== queue[0] && jQuery.dequeue(this, type)
					})
				},
				dequeue: function(type) {
					return this.each(function() {
						jQuery.dequeue(this, type)
					})
				},
				delay: function(time, type) {
					return time = jQuery.fx ? jQuery.fx.speeds[time] || time : time, type = type || "fx", this.queue(type, function(next, hooks) {
						var timeout = setTimeout(next, time);
						hooks.stop = function() {
							clearTimeout(timeout)
						}
					})
				},
				clearQueue: function(type) {
					return this.queue(type || "fx", [])
				},
				promise: function(type, obj) {
					var tmp, count = 1,
						defer = jQuery.Deferred(),
						elements = this,
						i = this.length,
						resolve = function() {
							--count || defer.resolveWith(elements, [elements])
						};
					for("string" != typeof type && (obj = type, type = undefined), type = type || "fx"; i--;) tmp = jQuery._data(elements[i], type + "queueHooks"), tmp && tmp.empty && (count++, tmp.empty.add(resolve));
					return resolve(), defer.promise(obj)
				}
			});
			var nodeHook, boolHook, rclass = /[\t\r\n]/g,
				rreturn = /\r/g,
				rfocusable = /^(?:input|select|textarea|button|object)$/i,
				rclickable = /^(?:a|area)$/i,
				rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
				ruseDefault = /^(?:checked|selected)$/i,
				getSetAttribute = jQuery.support.getSetAttribute,
				getSetInput = jQuery.support.input;
			jQuery.fn.extend({
				attr: function(name, value) {
					return jQuery.access(this, jQuery.attr, name, value, arguments.length > 1)
				},
				removeAttr: function(name) {
					return this.each(function() {
						jQuery.removeAttr(this, name)
					})
				},
				prop: function(name, value) {
					return jQuery.access(this, jQuery.prop, name, value, arguments.length > 1)
				},
				removeProp: function(name) {
					return name = jQuery.propFix[name] || name, this.each(function() {
						try {
							this[name] = undefined, delete this[name]
						} catch(e) {}
					})
				},
				addClass: function(value) {
					var classes, elem, cur, clazz, j, i = 0,
						len = this.length,
						proceed = "string" == typeof value && value;
					if(jQuery.isFunction(value)) return this.each(function(j) {
						jQuery(this).addClass(value.call(this, j, this.className))
					});
					if(proceed)
						for(classes = (value || "").match(core_rnotwhite) || []; len > i; i++)
							if(elem = this[i], cur = 1 === elem.nodeType && (elem.className ? (" " + elem.className + " ").replace(rclass, " ") : " ")) {
								for(j = 0; clazz = classes[j++];) cur.indexOf(" " + clazz + " ") < 0 && (cur += clazz + " ");
								elem.className = jQuery.trim(cur)
							}
					return this
				},
				removeClass: function(value) {
					var classes, elem, cur, clazz, j, i = 0,
						len = this.length,
						proceed = 0 === arguments.length || "string" == typeof value && value;
					if(jQuery.isFunction(value)) return this.each(function(j) {
						jQuery(this).removeClass(value.call(this, j, this.className))
					});
					if(proceed)
						for(classes = (value || "").match(core_rnotwhite) || []; len > i; i++)
							if(elem = this[i], cur = 1 === elem.nodeType && (elem.className ? (" " + elem.className + " ").replace(rclass, " ") : "")) {
								for(j = 0; clazz = classes[j++];)
									for(; cur.indexOf(" " + clazz + " ") >= 0;) cur = cur.replace(" " + clazz + " ", " ");
								elem.className = value ? jQuery.trim(cur) : ""
							}
					return this
				},
				toggleClass: function(value, stateVal) {
					var type = typeof value,
						isBool = "boolean" == typeof stateVal;
					return jQuery.isFunction(value) ? this.each(function(i) {
						jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal)
					}) : this.each(function() {
						if("string" === type)
							for(var className, i = 0, self = jQuery(this), state = stateVal, classNames = value.match(core_rnotwhite) || []; className = classNames[i++];) state = isBool ? state : !self.hasClass(className), self[state ? "addClass" : "removeClass"](className);
						else(type === core_strundefined || "boolean" === type) && (this.className && jQuery._data(this, "__className__", this.className), this.className = this.className || value === !1 ? "" : jQuery._data(this, "__className__") || "")
					})
				},
				hasClass: function(selector) {
					for(var className = " " + selector + " ", i = 0, l = this.length; l > i; i++)
						if(1 === this[i].nodeType && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) >= 0) return !0;
					return !1
				},
				val: function(value) {
					var ret, hooks, isFunction, elem = this[0]; {
						if(arguments.length) return isFunction = jQuery.isFunction(value), this.each(function(i) {
							var val, self = jQuery(this);
							1 === this.nodeType && (val = isFunction ? value.call(this, i, self.val()) : value, null == val ? val = "" : "number" == typeof val ? val += "" : jQuery.isArray(val) && (val = jQuery.map(val, function(value) {
								return null == value ? "" : value + ""
							})), hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()], hooks && "set" in hooks && hooks.set(this, val, "value") !== undefined || (this.value = val))
						});
						if(elem) return hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()], hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined ? ret : (ret = elem.value, "string" == typeof ret ? ret.replace(rreturn, "") : null == ret ? "" : ret)
					}
				}
			}), jQuery.extend({
				valHooks: {
					option: {
						get: function(elem) {
							var val = elem.attributes.value;
							return !val || val.specified ? elem.value : elem.text
						}
					},
					select: {
						get: function(elem) {
							for(var value, option, options = elem.options, index = elem.selectedIndex, one = "select-one" === elem.type || 0 > index, values = one ? null : [], max = one ? index + 1 : options.length, i = 0 > index ? max : one ? index : 0; max > i; i++)
								if(option = options[i], (option.selected || i === index) && (jQuery.support.optDisabled ? !option.disabled : null === option.getAttribute("disabled")) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
									if(value = jQuery(option).val(), one) return value;
									values.push(value)
								}
							return values
						},
						set: function(elem, value) {
							var values = jQuery.makeArray(value);
							return jQuery(elem).find("option").each(function() {
								this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0
							}), values.length || (elem.selectedIndex = -1), values
						}
					}
				},
				attr: function(elem, name, value) {
					var hooks, notxml, ret, nType = elem.nodeType;
					if(elem && 3 !== nType && 8 !== nType && 2 !== nType) return typeof elem.getAttribute === core_strundefined ? jQuery.prop(elem, name, value) : (notxml = 1 !== nType || !jQuery.isXMLDoc(elem), notxml && (name = name.toLowerCase(), hooks = jQuery.attrHooks[name] || (rboolean.test(name) ? boolHook : nodeHook)), value === undefined ? hooks && notxml && "get" in hooks && null !== (ret = hooks.get(elem, name)) ? ret : (typeof elem.getAttribute !== core_strundefined && (ret = elem.getAttribute(name)), null == ret ? undefined : ret) : null !== value ? hooks && notxml && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined ? ret : (elem.setAttribute(name, value + ""), value) : void jQuery.removeAttr(elem, name))
				},
				removeAttr: function(elem, value) {
					var name, propName, i = 0,
						attrNames = value && value.match(core_rnotwhite);
					if(attrNames && 1 === elem.nodeType)
						for(; name = attrNames[i++];) propName = jQuery.propFix[name] || name, rboolean.test(name) ? !getSetAttribute && ruseDefault.test(name) ? elem[jQuery.camelCase("default-" + name)] = elem[propName] = !1 : elem[propName] = !1 : jQuery.attr(elem, name, ""), elem.removeAttribute(getSetAttribute ? name : propName)
				},
				attrHooks: {
					type: {
						set: function(elem, value) {
							if(!jQuery.support.radioValue && "radio" === value && jQuery.nodeName(elem, "input")) {
								var val = elem.value;
								return elem.setAttribute("type", value), val && (elem.value = val), value
							}
						}
					}
				},
				propFix: {
					tabindex: "tabIndex",
					readonly: "readOnly",
					"for": "htmlFor",
					"class": "className",
					maxlength: "maxLength",
					cellspacing: "cellSpacing",
					cellpadding: "cellPadding",
					rowspan: "rowSpan",
					colspan: "colSpan",
					usemap: "useMap",
					frameborder: "frameBorder",
					contenteditable: "contentEditable"
				},
				prop: function(elem, name, value) {
					var ret, hooks, notxml, nType = elem.nodeType;
					if(elem && 3 !== nType && 8 !== nType && 2 !== nType) return notxml = 1 !== nType || !jQuery.isXMLDoc(elem), notxml && (name = jQuery.propFix[name] || name, hooks = jQuery.propHooks[name]), value !== undefined ? hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined ? ret : elem[name] = value : hooks && "get" in hooks && null !== (ret = hooks.get(elem, name)) ? ret : elem[name]
				},
				propHooks: {
					tabIndex: {
						get: function(elem) {
							var attributeNode = elem.getAttributeNode("tabindex");
							return attributeNode && attributeNode.specified ? parseInt(attributeNode.value, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : undefined
						}
					}
				}
			}), boolHook = {
				get: function(elem, name) {
					var prop = jQuery.prop(elem, name),
						attr = "boolean" == typeof prop && elem.getAttribute(name),
						detail = "boolean" == typeof prop ? getSetInput && getSetAttribute ? null != attr : ruseDefault.test(name) ? elem[jQuery.camelCase("default-" + name)] : !!attr : elem.getAttributeNode(name);
					return detail && detail.value !== !1 ? name.toLowerCase() : undefined
				},
				set: function(elem, value, name) {
					return value === !1 ? jQuery.removeAttr(elem, name) : getSetInput && getSetAttribute || !ruseDefault.test(name) ? elem.setAttribute(!getSetAttribute && jQuery.propFix[name] || name, name) : elem[jQuery.camelCase("default-" + name)] = elem[name] = !0, name
				}
			}, getSetInput && getSetAttribute || (jQuery.attrHooks.value = {
				get: function(elem, name) {
					var ret = elem.getAttributeNode(name);
					return jQuery.nodeName(elem, "input") ? elem.defaultValue : ret && ret.specified ? ret.value : undefined
				},
				set: function(elem, value, name) {
					return jQuery.nodeName(elem, "input") ? void(elem.defaultValue = value) : nodeHook && nodeHook.set(elem, value, name)
				}
			}), getSetAttribute || (nodeHook = jQuery.valHooks.button = {
				get: function(elem, name) {
					var ret = elem.getAttributeNode(name);
					return ret && ("id" === name || "name" === name || "coords" === name ? "" !== ret.value : ret.specified) ? ret.value : undefined
				},
				set: function(elem, value, name) {
					var ret = elem.getAttributeNode(name);
					return ret || elem.setAttributeNode(ret = elem.ownerDocument.createAttribute(name)), ret.value = value += "", "value" === name || value === elem.getAttribute(name) ? value : undefined
				}
			}, jQuery.attrHooks.contenteditable = {
				get: nodeHook.get,
				set: function(elem, value, name) {
					nodeHook.set(elem, "" === value ? !1 : value, name)
				}
			}, jQuery.each(["width", "height"], function(i, name) {
				jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
					set: function(elem, value) {
						return "" === value ? (elem.setAttribute(name, "auto"), value) : void 0
					}
				})
			})), jQuery.support.hrefNormalized || (jQuery.each(["href", "src", "width", "height"], function(i, name) {
				jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
					get: function(elem) {
						var ret = elem.getAttribute(name, 2);
						return null == ret ? undefined : ret
					}
				})
			}), jQuery.each(["href", "src"], function(i, name) {
				jQuery.propHooks[name] = {
					get: function(elem) {
						return elem.getAttribute(name, 4)
					}
				}
			})), jQuery.support.style || (jQuery.attrHooks.style = {
				get: function(elem) {
					return elem.style.cssText || undefined
				},
				set: function(elem, value) {
					return elem.style.cssText = value + ""
				}
			}), jQuery.support.optSelected || (jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, {
				get: function(elem) {
					var parent = elem.parentNode;
					return parent && (parent.selectedIndex, parent.parentNode && parent.parentNode.selectedIndex), null
				}
			})), jQuery.support.enctype || (jQuery.propFix.enctype = "encoding"), jQuery.support.checkOn || jQuery.each(["radio", "checkbox"], function() {
				jQuery.valHooks[this] = {
					get: function(elem) {
						return null === elem.getAttribute("value") ? "on" : elem.value
					}
				}
			}), jQuery.each(["radio", "checkbox"], function() {
				jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], {
					set: function(elem, value) {
						return jQuery.isArray(value) ? elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0 : void 0
					}
				})
			});
			var rformElems = /^(?:input|select|textarea)$/i,
				rkeyEvent = /^key/,
				rmouseEvent = /^(?:mouse|contextmenu)|click/,
				rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
				rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
			jQuery.event = {
					global: {},
					add: function(elem, types, handler, data, selector) {
						var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data(elem);
						if(elemData) {
							for(handler.handler && (handleObjIn = handler, handler = handleObjIn.handler, selector = handleObjIn.selector), handler.guid || (handler.guid = jQuery.guid++), (events = elemData.events) || (events = elemData.events = {}), (eventHandle = elemData.handle) || (eventHandle = elemData.handle = function(e) {
									return typeof jQuery === core_strundefined || e && jQuery.event.triggered === e.type ? undefined : jQuery.event.dispatch.apply(eventHandle.elem, arguments)
								}, eventHandle.elem = elem), types = (types || "").match(core_rnotwhite) || [""], t = types.length; t--;) tmp = rtypenamespace.exec(types[t]) || [], type = origType = tmp[1], namespaces = (tmp[2] || "").split(".").sort(), special = jQuery.event.special[type] || {}, type = (selector ? special.delegateType : special.bindType) || type, special = jQuery.event.special[type] || {}, handleObj = jQuery.extend({
								type: type,
								origType: origType,
								data: data,
								handler: handler,
								guid: handler.guid,
								selector: selector,
								needsContext: selector && jQuery.expr.match.needsContext.test(selector),
								namespace: namespaces.join(".")
							}, handleObjIn), (handlers = events[type]) || (handlers = events[type] = [], handlers.delegateCount = 0, special.setup && special.setup.call(elem, data, namespaces, eventHandle) !== !1 || (elem.addEventListener ? elem.addEventListener(type, eventHandle, !1) : elem.attachEvent && elem.attachEvent("on" + type, eventHandle))), special.add && (special.add.call(elem, handleObj), handleObj.handler.guid || (handleObj.handler.guid = handler.guid)), selector ? handlers.splice(handlers.delegateCount++, 0, handleObj) : handlers.push(handleObj), jQuery.event.global[type] = !0;
							elem = null
						}
					},
					remove: function(elem, types, handler, selector, mappedTypes) {
						var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData(elem) && jQuery._data(elem);
						if(elemData && (events = elemData.events)) {
							for(types = (types || "").match(core_rnotwhite) || [""], t = types.length; t--;)
								if(tmp = rtypenamespace.exec(types[t]) || [], type = origType = tmp[1], namespaces = (tmp[2] || "").split(".").sort(), type) {
									for(special = jQuery.event.special[type] || {}, type = (selector ? special.delegateType : special.bindType) || type, handlers = events[type] || [], tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"), origCount = j = handlers.length; j--;) handleObj = handlers[j], !mappedTypes && origType !== handleObj.origType || handler && handler.guid !== handleObj.guid || tmp && !tmp.test(handleObj.namespace) || selector && selector !== handleObj.selector && ("**" !== selector || !handleObj.selector) || (handlers.splice(j, 1), handleObj.selector && handlers.delegateCount--, special.remove && special.remove.call(elem, handleObj));
									origCount && !handlers.length && (special.teardown && special.teardown.call(elem, namespaces, elemData.handle) !== !1 || jQuery.removeEvent(elem, type, elemData.handle), delete events[type])
								} else
									for(type in events) jQuery.event.remove(elem, type + types[t], handler, selector, !0);
							jQuery.isEmptyObject(events) && (delete elemData.handle, jQuery._removeData(elem, "events"))
						}
					},
					trigger: function(event, data, elem, onlyHandlers) {
						var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [elem || document],
							type = core_hasOwn.call(event, "type") ? event.type : event,
							namespaces = core_hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
						if(cur = tmp = elem = elem || document, 3 !== elem.nodeType && 8 !== elem.nodeType && !rfocusMorph.test(type + jQuery.event.triggered) && (type.indexOf(".") >= 0 && (namespaces = type.split("."), type = namespaces.shift(), namespaces.sort()), ontype = type.indexOf(":") < 0 && "on" + type, event = event[jQuery.expando] ? event : new jQuery.Event(type, "object" == typeof event && event), event.isTrigger = !0, event.namespace = namespaces.join("."), event.namespace_re = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, event.result = undefined, event.target || (event.target = elem), data = null == data ? [event] : jQuery.makeArray(data, [event]), special = jQuery.event.special[type] || {}, onlyHandlers || !special.trigger || special.trigger.apply(elem, data) !== !1)) {
							if(!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
								for(bubbleType = special.delegateType || type, rfocusMorph.test(bubbleType + type) || (cur = cur.parentNode); cur; cur = cur.parentNode) eventPath.push(cur), tmp = cur;
								tmp === (elem.ownerDocument || document) && eventPath.push(tmp.defaultView || tmp.parentWindow || window)
							}
							for(i = 0;
								(cur = eventPath[i++]) && !event.isPropagationStopped();) event.type = i > 1 ? bubbleType : special.bindType || type, handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle"), handle && handle.apply(cur, data), handle = ontype && cur[ontype], handle && jQuery.acceptData(cur) && handle.apply && handle.apply(cur, data) === !1 && event.preventDefault();
							if(event.type = type, !onlyHandlers && !event.isDefaultPrevented() && (!special._default || special._default.apply(elem.ownerDocument, data) === !1) && ("click" !== type || !jQuery.nodeName(elem, "a")) && jQuery.acceptData(elem) && ontype && elem[type] && !jQuery.isWindow(elem)) {
								tmp = elem[ontype], tmp && (elem[ontype] = null), jQuery.event.triggered = type;
								try {
									elem[type]()
								} catch(e) {}
								jQuery.event.triggered = undefined, tmp && (elem[ontype] = tmp)
							}
							return event.result
						}
					},
					dispatch: function(event) {
						event = jQuery.event.fix(event);
						var i, ret, handleObj, matched, j, handlerQueue = [],
							args = core_slice.call(arguments),
							handlers = (jQuery._data(this, "events") || {})[event.type] || [],
							special = jQuery.event.special[event.type] || {};
						if(args[0] = event, event.delegateTarget = this, !special.preDispatch || special.preDispatch.call(this, event) !== !1) {
							for(handlerQueue = jQuery.event.handlers.call(this, event, handlers), i = 0;
								(matched = handlerQueue[i++]) && !event.isPropagationStopped();)
								for(event.currentTarget = matched.elem, j = 0;
									(handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped();)(!event.namespace_re || event.namespace_re.test(handleObj.namespace)) && (event.handleObj = handleObj, event.data = handleObj.data, ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args), ret !== undefined && (event.result = ret) === !1 && (event.preventDefault(), event.stopPropagation()));
							return special.postDispatch && special.postDispatch.call(this, event), event.result
						}
					},
					handlers: function(event, handlers) {
						var sel, handleObj, matches, i, handlerQueue = [],
							delegateCount = handlers.delegateCount,
							cur = event.target;
						if(delegateCount && cur.nodeType && (!event.button || "click" !== event.type))
							for(; cur != this; cur = cur.parentNode || this)
								if(1 === cur.nodeType && (cur.disabled !== !0 || "click" !== event.type)) {
									for(matches = [], i = 0; delegateCount > i; i++) handleObj = handlers[i], sel = handleObj.selector + " ", matches[sel] === undefined && (matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) >= 0 : jQuery.find(sel, this, null, [cur]).length), matches[sel] && matches.push(handleObj);
									matches.length && handlerQueue.push({
										elem: cur,
										handlers: matches
									})
								}
						return delegateCount < handlers.length && handlerQueue.push({
							elem: this,
							handlers: handlers.slice(delegateCount)
						}), handlerQueue
					},
					fix: function(event) {
						if(event[jQuery.expando]) return event;
						var i, prop, copy, type = event.type,
							originalEvent = event,
							fixHook = this.fixHooks[type];
						for(fixHook || (this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {}), copy = fixHook.props ? this.props.concat(fixHook.props) : this.props, event = new jQuery.Event(originalEvent), i = copy.length; i--;) prop = copy[i], event[prop] = originalEvent[prop];
						return event.target || (event.target = originalEvent.srcElement || document), 3 === event.target.nodeType && (event.target = event.target.parentNode), event.metaKey = !!event.metaKey, fixHook.filter ? fixHook.filter(event, originalEvent) : event
					},
					props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
					fixHooks: {},
					keyHooks: {
						props: "char charCode key keyCode".split(" "),
						filter: function(event, original) {
							return null == event.which && (event.which = null != original.charCode ? original.charCode : original.keyCode), event
						}
					},
					mouseHooks: {
						props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
						filter: function(event, original) {
							var body, eventDoc, doc, button = original.button,
								fromElement = original.fromElement;
							return null == event.pageX && null != original.clientX && (eventDoc = event.target.ownerDocument || document, doc = eventDoc.documentElement, body = eventDoc.body, event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0), event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0)), !event.relatedTarget && fromElement && (event.relatedTarget = fromElement === event.target ? original.toElement : fromElement), event.which || button === undefined || (event.which = 1 & button ? 1 : 2 & button ? 3 : 4 & button ? 2 : 0), event
						}
					},
					special: {
						load: {
							noBubble: !0
						},
						click: {
							trigger: function() {
								return jQuery.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : void 0
							}
						},
						focus: {
							trigger: function() {
								if(this !== document.activeElement && this.focus) try {
									return this.focus(), !1
								} catch(e) {}
							},
							delegateType: "focusin"
						},
						blur: {
							trigger: function() {
								return this === document.activeElement && this.blur ? (this.blur(), !1) : void 0
							},
							delegateType: "focusout"
						},
						beforeunload: {
							postDispatch: function(event) {
								event.result !== undefined && (event.originalEvent.returnValue = event.result)
							}
						}
					},
					simulate: function(type, elem, event, bubble) {
						var e = jQuery.extend(new jQuery.Event, event, {
							type: type,
							isSimulated: !0,
							originalEvent: {}
						});
						bubble ? jQuery.event.trigger(e, null, elem) : jQuery.event.dispatch.call(elem, e), e.isDefaultPrevented() && event.preventDefault()
					}
				}, jQuery.removeEvent = document.removeEventListener ? function(elem, type, handle) {
					elem.removeEventListener && elem.removeEventListener(type, handle, !1)
				} : function(elem, type, handle) {
					var name = "on" + type;
					elem.detachEvent && (typeof elem[name] === core_strundefined && (elem[name] = null), elem.detachEvent(name, handle))
				}, jQuery.Event = function(src, props) {
					return this instanceof jQuery.Event ? (src && src.type ? (this.originalEvent = src, this.type = src.type, this.isDefaultPrevented = src.defaultPrevented || src.returnValue === !1 || src.getPreventDefault && src.getPreventDefault() ? returnTrue : returnFalse) : this.type = src, props && jQuery.extend(this, props), this.timeStamp = src && src.timeStamp || jQuery.now(), void(this[jQuery.expando] = !0)) : new jQuery.Event(src, props)
				}, jQuery.Event.prototype = {
					isDefaultPrevented: returnFalse,
					isPropagationStopped: returnFalse,
					isImmediatePropagationStopped: returnFalse,
					preventDefault: function() {
						var e = this.originalEvent;
						this.isDefaultPrevented = returnTrue, e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1)
					},
					stopPropagation: function() {
						var e = this.originalEvent;
						this.isPropagationStopped = returnTrue, e && (e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0)
					},
					stopImmediatePropagation: function() {
						this.isImmediatePropagationStopped = returnTrue, this.stopPropagation()
					}
				}, jQuery.each({
					mouseenter: "mouseover",
					mouseleave: "mouseout"
				}, function(orig, fix) {
					jQuery.event.special[orig] = {
						delegateType: fix,
						bindType: fix,
						handle: function(event) {
							var ret, target = this,
								related = event.relatedTarget,
								handleObj = event.handleObj;
							return(!related || related !== target && !jQuery.contains(target, related)) && (event.type = handleObj.origType, ret = handleObj.handler.apply(this, arguments), event.type = fix), ret
						}
					}
				}), jQuery.support.submitBubbles || (jQuery.event.special.submit = {
					setup: function() {
						return jQuery.nodeName(this, "form") ? !1 : void jQuery.event.add(this, "click._submit keypress._submit", function(e) {
							var elem = e.target,
								form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined;
							form && !jQuery._data(form, "submitBubbles") && (jQuery.event.add(form, "submit._submit", function(event) {
								event._submit_bubble = !0
							}), jQuery._data(form, "submitBubbles", !0))
						})
					},
					postDispatch: function(event) {
						event._submit_bubble && (delete event._submit_bubble, this.parentNode && !event.isTrigger && jQuery.event.simulate("submit", this.parentNode, event, !0))
					},
					teardown: function() {
						return jQuery.nodeName(this, "form") ? !1 : void jQuery.event.remove(this, "._submit")
					}
				}), jQuery.support.changeBubbles || (jQuery.event.special.change = {
					setup: function() {
						return rformElems.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (jQuery.event.add(this, "propertychange._change", function(event) {
							"checked" === event.originalEvent.propertyName && (this._just_changed = !0)
						}), jQuery.event.add(this, "click._change", function(event) {
							this._just_changed && !event.isTrigger && (this._just_changed = !1), jQuery.event.simulate("change", this, event, !0)
						})), !1) : void jQuery.event.add(this, "beforeactivate._change", function(e) {
							var elem = e.target;
							rformElems.test(elem.nodeName) && !jQuery._data(elem, "changeBubbles") && (jQuery.event.add(elem, "change._change", function(event) {
								!this.parentNode || event.isSimulated || event.isTrigger || jQuery.event.simulate("change", this.parentNode, event, !0)
							}), jQuery._data(elem, "changeBubbles", !0))
						})
					},
					handle: function(event) {
						var elem = event.target;
						return this !== elem || event.isSimulated || event.isTrigger || "radio" !== elem.type && "checkbox" !== elem.type ? event.handleObj.handler.apply(this, arguments) : void 0
					},
					teardown: function() {
						return jQuery.event.remove(this, "._change"), !rformElems.test(this.nodeName)
					}
				}), jQuery.support.focusinBubbles || jQuery.each({
					focus: "focusin",
					blur: "focusout"
				}, function(orig, fix) {
					var attaches = 0,
						handler = function(event) {
							jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), !0)
						};
					jQuery.event.special[fix] = {
						setup: function() {
							0 === attaches++ && document.addEventListener(orig, handler, !0)
						},
						teardown: function() {
							0 === --attaches && document.removeEventListener(orig, handler, !0)
						}
					}
				}), jQuery.fn.extend({
					on: function(types, selector, data, fn, one) {
						var type, origFn;
						if("object" == typeof types) {
							"string" != typeof selector && (data = data || selector, selector = undefined);
							for(type in types) this.on(type, selector, data, types[type], one);
							return this
						}
						if(null == data && null == fn ? (fn = selector, data = selector = undefined) : null == fn && ("string" == typeof selector ? (fn = data, data = undefined) : (fn = data, data = selector, selector = undefined)), fn === !1) fn = returnFalse;
						else if(!fn) return this;
						return 1 === one && (origFn = fn, fn = function(event) {
							return jQuery().off(event), origFn.apply(this, arguments)
						}, fn.guid = origFn.guid || (origFn.guid = jQuery.guid++)), this.each(function() {
							jQuery.event.add(this, types, fn, data, selector)
						})
					},
					one: function(types, selector, data, fn) {
						return this.on(types, selector, data, fn, 1)
					},
					off: function(types, selector, fn) {
						var handleObj, type;
						if(types && types.preventDefault && types.handleObj) return handleObj = types.handleObj, jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler), this;
						if("object" == typeof types) {
							for(type in types) this.off(type, selector, types[type]);
							return this
						}
						return(selector === !1 || "function" == typeof selector) && (fn = selector, selector = undefined), fn === !1 && (fn = returnFalse), this.each(function() {
							jQuery.event.remove(this, types, fn, selector)
						})
					},
					bind: function(types, data, fn) {
						return this.on(types, null, data, fn)
					},
					unbind: function(types, fn) {
						return this.off(types, null, fn)
					},
					delegate: function(selector, types, data, fn) {
						return this.on(types, selector, data, fn)
					},
					undelegate: function(selector, types, fn) {
						return 1 === arguments.length ? this.off(selector, "**") : this.off(types, selector || "**", fn)
					},
					trigger: function(type, data) {
						return this.each(function() {
							jQuery.event.trigger(type, data, this)
						})
					},
					triggerHandler: function(type, data) {
						var elem = this[0];
						return elem ? jQuery.event.trigger(type, data, elem, !0) : void 0
					}
				}),
				function(window, undefined) {
					function isNative(fn) {
						return rnative.test(fn + "")
					}

					function createCache() {
						var cache, keys = [];
						return cache = function(key, value) {
							return keys.push(key += " ") > Expr.cacheLength && delete cache[keys.shift()], cache[key] = value
						}
					}

					function markFunction(fn) {
						return fn[expando] = !0, fn
					}

					function assert(fn) {
						var div = document.createElement("div");
						try {
							return fn(div)
						} catch(e) {
							return !1
						} finally {
							div = null
						}
					}

					function Sizzle(selector, context, results, seed) {
						var match, elem, m, nodeType, i, groups, old, nid, newContext, newSelector;
						if((context ? context.ownerDocument || context : preferredDoc) !== document && setDocument(context), context = context || document, results = results || [], !selector || "string" != typeof selector) return results;
						if(1 !== (nodeType = context.nodeType) && 9 !== nodeType) return [];
						if(!documentIsXML && !seed) {
							if(match = rquickExpr.exec(selector))
								if(m = match[1]) {
									if(9 === nodeType) {
										if(elem = context.getElementById(m), !elem || !elem.parentNode) return results;
										if(elem.id === m) return results.push(elem), results
									} else if(context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains(context, elem) && elem.id === m) return results.push(elem), results
								} else {
									if(match[2]) return push.apply(results, slice.call(context.getElementsByTagName(selector), 0)), results;
									if((m = match[3]) && support.getByClassName && context.getElementsByClassName) return push.apply(results, slice.call(context.getElementsByClassName(m), 0)), results
								}
							if(support.qsa && !rbuggyQSA.test(selector)) {
								if(old = !0, nid = expando, newContext = context, newSelector = 9 === nodeType && selector, 1 === nodeType && "object" !== context.nodeName.toLowerCase()) {
									for(groups = tokenize(selector), (old = context.getAttribute("id")) ? nid = old.replace(rescape, "\\$&") : context.setAttribute("id", nid), nid = "[id='" + nid + "'] ", i = groups.length; i--;) groups[i] = nid + toSelector(groups[i]);
									newContext = rsibling.test(selector) && context.parentNode || context, newSelector = groups.join(",")
								}
								if(newSelector) try {
									return push.apply(results, slice.call(newContext.querySelectorAll(newSelector), 0)), results
								} catch(qsaError) {} finally {
									old || context.removeAttribute("id")
								}
							}
						}
						return select(selector.replace(rtrim, "$1"), context, results, seed)
					}

					function siblingCheck(a, b) {
						var cur = b && a,
							diff = cur && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);
						if(diff) return diff;
						if(cur)
							for(; cur = cur.nextSibling;)
								if(cur === b) return -1;
						return a ? 1 : -1
					}

					function createInputPseudo(type) {
						return function(elem) {
							var name = elem.nodeName.toLowerCase();
							return "input" === name && elem.type === type
						}
					}

					function createButtonPseudo(type) {
						return function(elem) {
							var name = elem.nodeName.toLowerCase();
							return("input" === name || "button" === name) && elem.type === type
						}
					}

					function createPositionalPseudo(fn) {
						return markFunction(function(argument) {
							return argument = +argument, markFunction(function(seed, matches) {
								for(var j, matchIndexes = fn([], seed.length, argument), i = matchIndexes.length; i--;) seed[j = matchIndexes[i]] && (seed[j] = !(matches[j] = seed[j]))
							})
						})
					}

					function tokenize(selector, parseOnly) {
						var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + " "];
						if(cached) return parseOnly ? 0 : cached.slice(0);
						for(soFar = selector, groups = [], preFilters = Expr.preFilter; soFar;) {
							(!matched || (match = rcomma.exec(soFar))) && (match && (soFar = soFar.slice(match[0].length) || soFar), groups.push(tokens = [])), matched = !1, (match = rcombinators.exec(soFar)) && (matched = match.shift(), tokens.push({
								value: matched,
								type: match[0].replace(rtrim, " ")
							}), soFar = soFar.slice(matched.length));
							for(type in Expr.filter) !(match = matchExpr[type].exec(soFar)) || preFilters[type] && !(match = preFilters[type](match)) || (matched = match.shift(), tokens.push({
								value: matched,
								type: type,
								matches: match
							}), soFar = soFar.slice(matched.length));
							if(!matched) break
						}
						return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : tokenCache(selector, groups).slice(0)
					}

					function toSelector(tokens) {
						for(var i = 0, len = tokens.length, selector = ""; len > i; i++) selector += tokens[i].value;
						return selector
					}

					function addCombinator(matcher, combinator, base) {
						var dir = combinator.dir,
							checkNonElements = base && "parentNode" === dir,
							doneName = done++;
						return combinator.first ? function(elem, context, xml) {
							for(; elem = elem[dir];)
								if(1 === elem.nodeType || checkNonElements) return matcher(elem, context, xml)
						} : function(elem, context, xml) {
							var data, cache, outerCache, dirkey = dirruns + " " + doneName;
							if(xml) {
								for(; elem = elem[dir];)
									if((1 === elem.nodeType || checkNonElements) && matcher(elem, context, xml)) return !0
							} else
								for(; elem = elem[dir];)
									if(1 === elem.nodeType || checkNonElements)
										if(outerCache = elem[expando] || (elem[expando] = {}), (cache = outerCache[dir]) && cache[0] === dirkey) {
											if((data = cache[1]) === !0 || data === cachedruns) return data === !0
										} else if(cache = outerCache[dir] = [dirkey], cache[1] = matcher(elem, context, xml) || cachedruns, cache[1] === !0) return !0
						}
					}

					function elementMatcher(matchers) {
						return matchers.length > 1 ? function(elem, context, xml) {
							for(var i = matchers.length; i--;)
								if(!matchers[i](elem, context, xml)) return !1;
							return !0
						} : matchers[0]
					}

					function condense(unmatched, map, filter, context, xml) {
						for(var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = null != map; len > i; i++)(elem = unmatched[i]) && (!filter || filter(elem, context, xml)) && (newUnmatched.push(elem), mapped && map.push(i));
						return newUnmatched
					}

					function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
						return postFilter && !postFilter[expando] && (postFilter = setMatcher(postFilter)), postFinder && !postFinder[expando] && (postFinder = setMatcher(postFinder, postSelector)), markFunction(function(seed, results, context, xml) {
							var temp, i, elem, preMap = [],
								postMap = [],
								preexisting = results.length,
								elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
								matcherIn = !preFilter || !seed && selector ? elems : condense(elems, preMap, preFilter, context, xml),
								matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;
							if(matcher && matcher(matcherIn, matcherOut, context, xml), postFilter)
								for(temp = condense(matcherOut, postMap), postFilter(temp, [], context, xml), i = temp.length; i--;)(elem = temp[i]) && (matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem));
							if(seed) {
								if(postFinder || preFilter) {
									if(postFinder) {
										for(temp = [], i = matcherOut.length; i--;)(elem = matcherOut[i]) && temp.push(matcherIn[i] = elem);
										postFinder(null, matcherOut = [], temp, xml)
									}
									for(i = matcherOut.length; i--;)(elem = matcherOut[i]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1 && (seed[temp] = !(results[temp] = elem))
								}
							} else matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut), postFinder ? postFinder(null, results, matcherOut, xml) : push.apply(results, matcherOut)
						})
					}

					function matcherFromTokens(tokens) {
						for(var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) {
								return elem === checkContext
							}, implicitRelative, !0), matchAnyContext = addCombinator(function(elem) {
								return indexOf.call(checkContext, elem) > -1
							}, implicitRelative, !0), matchers = [function(elem, context, xml) {
								return !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml))
							}]; len > i; i++)
							if(matcher = Expr.relative[tokens[i].type]) matchers = [addCombinator(elementMatcher(matchers), matcher)];
							else {
								if(matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches), matcher[expando]) {
									for(j = ++i; len > j && !Expr.relative[tokens[j].type]; j++);
									return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(tokens.slice(0, i - 1)).replace(rtrim, "$1"), matcher, j > i && matcherFromTokens(tokens.slice(i, j)), len > j && matcherFromTokens(tokens = tokens.slice(j)), len > j && toSelector(tokens))
								}
								matchers.push(matcher)
							}
						return elementMatcher(matchers)
					}

					function matcherFromGroupMatchers(elementMatchers, setMatchers) {
						var matcherCachedRuns = 0,
							bySet = setMatchers.length > 0,
							byElement = elementMatchers.length > 0,
							superMatcher = function(seed, context, xml, results, expandContext) {
								var elem, j, matcher, setMatched = [],
									matchedCount = 0,
									i = "0",
									unmatched = seed && [],
									outermost = null != expandContext,
									contextBackup = outermostContext,
									elems = seed || byElement && Expr.find.TAG("*", expandContext && context.parentNode || context),
									dirrunsUnique = dirruns += null == contextBackup ? 1 : Math.random() || .1;
								for(outermost && (outermostContext = context !== document && context, cachedruns = matcherCachedRuns); null != (elem = elems[i]); i++) {
									if(byElement && elem) {
										for(j = 0; matcher = elementMatchers[j++];)
											if(matcher(elem, context, xml)) {
												results.push(elem);
												break
											}
										outermost && (dirruns = dirrunsUnique, cachedruns = ++matcherCachedRuns)
									}
									bySet && ((elem = !matcher && elem) && matchedCount--, seed && unmatched.push(elem))
								}
								if(matchedCount += i, bySet && i !== matchedCount) {
									for(j = 0; matcher = setMatchers[j++];) matcher(unmatched, setMatched, context, xml);
									if(seed) {
										if(matchedCount > 0)
											for(; i--;) unmatched[i] || setMatched[i] || (setMatched[i] = pop.call(results));
										setMatched = condense(setMatched)
									}
									push.apply(results, setMatched), outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1 && Sizzle.uniqueSort(results)
								}
								return outermost && (dirruns = dirrunsUnique, outermostContext = contextBackup), unmatched
							};
						return bySet ? markFunction(superMatcher) : superMatcher
					}

					function multipleContexts(selector, contexts, results) {
						for(var i = 0, len = contexts.length; len > i; i++) Sizzle(selector, contexts[i], results);
						return results
					}

					function select(selector, context, results, seed) {
						var i, tokens, token, type, find, match = tokenize(selector);
						if(!seed && 1 === match.length) {
							if(tokens = match[0] = match[0].slice(0), tokens.length > 2 && "ID" === (token = tokens[0]).type && 9 === context.nodeType && !documentIsXML && Expr.relative[tokens[1].type]) {
								if(context = Expr.find.ID(token.matches[0].replace(runescape, funescape), context)[0], !context) return results;
								selector = selector.slice(tokens.shift().value.length)
							}
							for(i = matchExpr.needsContext.test(selector) ? 0 : tokens.length; i-- && (token = tokens[i], !Expr.relative[type = token.type]);)
								if((find = Expr.find[type]) && (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && context.parentNode || context))) {
									if(tokens.splice(i, 1), selector = seed.length && toSelector(tokens), !selector) return push.apply(results, slice.call(seed, 0)), results;
									break
								}
						}
						return compile(selector, match)(seed, context, documentIsXML, results, rsibling.test(selector)), results
					}

					function setFilters() {}
					var i, cachedruns, Expr, getText, isXML, compile, hasDuplicate, outermostContext, setDocument, document, docElem, documentIsXML, rbuggyQSA, rbuggyMatches, matches, contains, sortOrder, expando = "sizzle" + -new Date,
						preferredDoc = window.document,
						support = {},
						dirruns = 0,
						done = 0,
						classCache = createCache(),
						tokenCache = createCache(),
						compilerCache = createCache(),
						strundefined = typeof undefined,
						MAX_NEGATIVE = 1 << 31,
						arr = [],
						pop = arr.pop,
						push = arr.push,
						slice = arr.slice,
						indexOf = arr.indexOf || function(elem) {
							for(var i = 0, len = this.length; len > i; i++)
								if(this[i] === elem) return i;
							return -1
						},
						whitespace = "[\\x20\\t\\r\\n\\f]",
						characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
						identifier = characterEncoding.replace("w", "w#"),
						operators = "([*^$|!~]?=)",
						attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
						pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace(3, 8) + ")*)|.*)\\)|)",
						rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
						rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
						rcombinators = new RegExp("^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*"),
						rpseudo = new RegExp(pseudos),
						ridentifier = new RegExp("^" + identifier + "$"),
						matchExpr = {
							ID: new RegExp("^#(" + characterEncoding + ")"),
							CLASS: new RegExp("^\\.(" + characterEncoding + ")"),
							NAME: new RegExp("^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]"),
							TAG: new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),
							ATTR: new RegExp("^" + attributes),
							PSEUDO: new RegExp("^" + pseudos),
							CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
							needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
						},
						rsibling = /[\x20\t\r\n\f]*[+~]/,
						rnative = /^[^{]+\{\s*\[native code/,
						rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
						rinputs = /^(?:input|select|textarea|button)$/i,
						rheader = /^h\d$/i,
						rescape = /'|\\/g,
						rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
						runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
						funescape = function(_, escaped) {
							var high = "0x" + escaped - 65536;
							return high !== high ? escaped : 0 > high ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, 1023 & high | 56320)
						};
					try {
						slice.call(preferredDoc.documentElement.childNodes, 0)[0].nodeType
					} catch(e) {
						slice = function(i) {
							for(var elem, results = []; elem = this[i++];) results.push(elem);
							return results
						}
					}
					isXML = Sizzle.isXML = function(elem) {
						var documentElement = elem && (elem.ownerDocument || elem).documentElement;
						return documentElement ? "HTML" !== documentElement.nodeName : !1
					}, setDocument = Sizzle.setDocument = function(node) {
						var doc = node ? node.ownerDocument || node : preferredDoc;
						return doc !== document && 9 === doc.nodeType && doc.documentElement ? (document = doc, docElem = doc.documentElement, documentIsXML = isXML(doc), support.tagNameNoComments = assert(function(div) {
							return div.appendChild(doc.createComment("")), !div.getElementsByTagName("*").length
						}), support.attributes = assert(function(div) {
							div.innerHTML = "<select></select>";
							var type = typeof div.lastChild.getAttribute("multiple");
							return "boolean" !== type && "string" !== type
						}), support.getByClassName = assert(function(div) {
							return div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>", div.getElementsByClassName && div.getElementsByClassName("e").length ? (div.lastChild.className = "e", 2 === div.getElementsByClassName("e").length) : !1
						}), support.getByName = assert(function(div) {
							div.id = expando + 0, div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>", docElem.insertBefore(div, docElem.firstChild);
							var pass = doc.getElementsByName && doc.getElementsByName(expando).length === 2 + doc.getElementsByName(expando + 0).length;
							return support.getIdNotName = !doc.getElementById(expando), docElem.removeChild(div), pass
						}), Expr.attrHandle = assert(function(div) {
							return div.innerHTML = "<a href='#'></a>", div.firstChild && typeof div.firstChild.getAttribute !== strundefined && "#" === div.firstChild.getAttribute("href")
						}) ? {} : {
							href: function(elem) {
								return elem.getAttribute("href", 2)
							},
							type: function(elem) {
								return elem.getAttribute("type")
							}
						}, support.getIdNotName ? (Expr.find.ID = function(id, context) {
							if(typeof context.getElementById !== strundefined && !documentIsXML) {
								var m = context.getElementById(id);
								return m && m.parentNode ? [m] : []
							}
						}, Expr.filter.ID = function(id) {
							var attrId = id.replace(runescape, funescape);
							return function(elem) {
								return elem.getAttribute("id") === attrId
							}
						}) : (Expr.find.ID = function(id, context) {
							if(typeof context.getElementById !== strundefined && !documentIsXML) {
								var m = context.getElementById(id);
								return m ? m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? [m] : undefined : []
							}
						}, Expr.filter.ID = function(id) {
							var attrId = id.replace(runescape, funescape);
							return function(elem) {
								var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
								return node && node.value === attrId
							}
						}), Expr.find.TAG = support.tagNameNoComments ? function(tag, context) {
							return typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName(tag) : void 0
						} : function(tag, context) {
							var elem, tmp = [],
								i = 0,
								results = context.getElementsByTagName(tag);
							if("*" === tag) {
								for(; elem = results[i++];) 1 === elem.nodeType && tmp.push(elem);
								return tmp
							}
							return results
						}, Expr.find.NAME = support.getByName && function(tag, context) {
							return typeof context.getElementsByName !== strundefined ? context.getElementsByName(name) : void 0
						}, Expr.find.CLASS = support.getByClassName && function(className, context) {
							return typeof context.getElementsByClassName === strundefined || documentIsXML ? void 0 : context.getElementsByClassName(className)
						}, rbuggyMatches = [], rbuggyQSA = [":focus"], (support.qsa = isNative(doc.querySelectorAll)) && (assert(function(div) {
							div.innerHTML = "<select><option selected=''></option></select>", div.querySelectorAll("[selected]").length || rbuggyQSA.push("\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)"), div.querySelectorAll(":checked").length || rbuggyQSA.push(":checked")
						}), assert(function(div) {
							div.innerHTML = "<input type='hidden' i=''/>", div.querySelectorAll("[i^='']").length && rbuggyQSA.push("[*^$]=" + whitespace + "*(?:\"\"|'')"), div.querySelectorAll(":enabled").length || rbuggyQSA.push(":enabled", ":disabled"), div.querySelectorAll("*,:x"), rbuggyQSA.push(",.*:")
						})), (support.matchesSelector = isNative(matches = docElem.matchesSelector || docElem.mozMatchesSelector || docElem.webkitMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) && assert(function(div) {
							support.disconnectedMatch = matches.call(div, "div"), matches.call(div, "[s!='']:x"), rbuggyMatches.push("!=", pseudos)
						}), rbuggyQSA = new RegExp(rbuggyQSA.join("|")), rbuggyMatches = new RegExp(rbuggyMatches.join("|")), contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? function(a, b) {
							var adown = 9 === a.nodeType ? a.documentElement : a,
								bup = b && b.parentNode;
							return a === bup || !(!bup || 1 !== bup.nodeType || !(adown.contains ? adown.contains(bup) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(bup)))
						} : function(a, b) {
							if(b)
								for(; b = b.parentNode;)
									if(b === a) return !0;
							return !1
						}, sortOrder = docElem.compareDocumentPosition ? function(a, b) {
							var compare;
							return a === b ? (hasDuplicate = !0, 0) : (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition(b)) ? 1 & compare || a.parentNode && 11 === a.parentNode.nodeType ? a === doc || contains(preferredDoc, a) ? -1 : b === doc || contains(preferredDoc, b) ? 1 : 0 : 4 & compare ? -1 : 1 : a.compareDocumentPosition ? -1 : 1
						} : function(a, b) {
							var cur, i = 0,
								aup = a.parentNode,
								bup = b.parentNode,
								ap = [a],
								bp = [b];
							if(a === b) return hasDuplicate = !0, 0;
							if(!aup || !bup) return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : 0;
							if(aup === bup) return siblingCheck(a, b);
							for(cur = a; cur = cur.parentNode;) ap.unshift(cur);
							for(cur = b; cur = cur.parentNode;) bp.unshift(cur);
							for(; ap[i] === bp[i];) i++;
							return i ? siblingCheck(ap[i], bp[i]) : ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0
						}, hasDuplicate = !1, [0, 0].sort(sortOrder), support.detectDuplicates = hasDuplicate, document) : document
					}, Sizzle.matches = function(expr, elements) {
						return Sizzle(expr, null, null, elements)
					}, Sizzle.matchesSelector = function(elem, expr) {
						if((elem.ownerDocument || elem) !== document && setDocument(elem), expr = expr.replace(rattributeQuotes, "='$1']"), support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr)) try {
							var ret = matches.call(elem, expr);
							if(ret || support.disconnectedMatch || elem.document && 11 !== elem.document.nodeType) return ret
						} catch(e) {}
						return Sizzle(expr, document, null, [elem]).length > 0
					}, Sizzle.contains = function(context, elem) {
						return(context.ownerDocument || context) !== document && setDocument(context), contains(context, elem)
					}, Sizzle.attr = function(elem, name) {
						var val;
						return(elem.ownerDocument || elem) !== document && setDocument(elem), documentIsXML || (name = name.toLowerCase()), (val = Expr.attrHandle[name]) ? val(elem) : documentIsXML || support.attributes ? elem.getAttribute(name) : ((val = elem.getAttributeNode(name)) || elem.getAttribute(name)) && elem[name] === !0 ? name : val && val.specified ? val.value : null
					}, Sizzle.error = function(msg) {
						throw new Error("Syntax error, unrecognized expression: " + msg)
					}, Sizzle.uniqueSort = function(results) {
						var elem, duplicates = [],
							i = 1,
							j = 0;
						if(hasDuplicate = !support.detectDuplicates, results.sort(sortOrder), hasDuplicate) {
							for(; elem = results[i]; i++) elem === results[i - 1] && (j = duplicates.push(i));
							for(; j--;) results.splice(duplicates[j], 1)
						}
						return results
					}, getText = Sizzle.getText = function(elem) {
						var node, ret = "",
							i = 0,
							nodeType = elem.nodeType;
						if(nodeType) {
							if(1 === nodeType || 9 === nodeType || 11 === nodeType) {
								if("string" == typeof elem.textContent) return elem.textContent;
								for(elem = elem.firstChild; elem; elem = elem.nextSibling) ret += getText(elem)
							} else if(3 === nodeType || 4 === nodeType) return elem.nodeValue
						} else
							for(; node = elem[i]; i++) ret += getText(node);
						return ret
					}, Expr = Sizzle.selectors = {
						cacheLength: 50,
						createPseudo: markFunction,
						match: matchExpr,
						find: {},
						relative: {
							">": {
								dir: "parentNode",
								first: !0
							},
							" ": {
								dir: "parentNode"
							},
							"+": {
								dir: "previousSibling",
								first: !0
							},
							"~": {
								dir: "previousSibling"
							}
						},
						preFilter: {
							ATTR: function(match) {
								return match[1] = match[1].replace(runescape, funescape), match[3] = (match[4] || match[5] || "").replace(runescape, funescape), "~=" === match[2] && (match[3] = " " + match[3] + " "), match.slice(0, 4)
							},
							CHILD: function(match) {
								return match[1] = match[1].toLowerCase(), "nth" === match[1].slice(0, 3) ? (match[3] || Sizzle.error(match[0]), match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * ("even" === match[3] || "odd" === match[3])), match[5] = +(match[7] + match[8] || "odd" === match[3])) : match[3] && Sizzle.error(match[0]), match
							},
							PSEUDO: function(match) {
								var excess, unquoted = !match[5] && match[2];
								return matchExpr.CHILD.test(match[0]) ? null : (match[4] ? match[2] = match[4] : unquoted && rpseudo.test(unquoted) && (excess = tokenize(unquoted, !0)) && (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length) && (match[0] = match[0].slice(0, excess), match[2] = unquoted.slice(0, excess)), match.slice(0, 3))
							}
						},
						filter: {
							TAG: function(nodeName) {
								return "*" === nodeName ? function() {
									return !0
								} : (nodeName = nodeName.replace(runescape, funescape).toLowerCase(), function(elem) {
									return elem.nodeName && elem.nodeName.toLowerCase() === nodeName
								})
							},
							CLASS: function(className) {
								var pattern = classCache[className + " "];
								return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function(elem) {
									return pattern.test(elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "")
								})
							},
							ATTR: function(name, operator, check) {
								return function(elem) {
									var result = Sizzle.attr(elem, name);
									return null == result ? "!=" === operator : operator ? (result += "", "=" === operator ? result === check : "!=" === operator ? result !== check : "^=" === operator ? check && 0 === result.indexOf(check) : "*=" === operator ? check && result.indexOf(check) > -1 : "$=" === operator ? check && result.slice(-check.length) === check : "~=" === operator ? (" " + result + " ").indexOf(check) > -1 : "|=" === operator ? result === check || result.slice(0, check.length + 1) === check + "-" : !1) : !0
								}
							},
							CHILD: function(type, what, argument, first, last) {
								var simple = "nth" !== type.slice(0, 3),
									forward = "last" !== type.slice(-4),
									ofType = "of-type" === what;
								return 1 === first && 0 === last ? function(elem) {
									return !!elem.parentNode
								} : function(elem, context, xml) {
									var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling",
										parent = elem.parentNode,
										name = ofType && elem.nodeName.toLowerCase(),
										useCache = !xml && !ofType;
									if(parent) {
										if(simple) {
											for(; dir;) {
												for(node = elem; node = node[dir];)
													if(ofType ? node.nodeName.toLowerCase() === name : 1 === node.nodeType) return !1;
												start = dir = "only" === type && !start && "nextSibling"
											}
											return !0
										}
										if(start = [forward ? parent.firstChild : parent.lastChild], forward && useCache) {
											for(outerCache = parent[expando] || (parent[expando] = {}), cache = outerCache[type] || [], nodeIndex = cache[0] === dirruns && cache[1], diff = cache[0] === dirruns && cache[2], node = nodeIndex && parent.childNodes[nodeIndex]; node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop();)
												if(1 === node.nodeType && ++diff && node === elem) {
													outerCache[type] = [dirruns, nodeIndex, diff];
													break
												}
										} else if(useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) diff = cache[1];
										else
											for(;
												(node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) && ((ofType ? node.nodeName.toLowerCase() !== name : 1 !== node.nodeType) || !++diff || (useCache && ((node[expando] || (node[expando] = {}))[type] = [dirruns, diff]),
													node !== elem)););
										return diff -= last, diff === first || diff % first === 0 && diff / first >= 0
									}
								}
							},
							PSEUDO: function(pseudo, argument) {
								var args, fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);
								return fn[expando] ? fn(argument) : fn.length > 1 ? (args = [pseudo, pseudo, "", argument], Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(seed, matches) {
									for(var idx, matched = fn(seed, argument), i = matched.length; i--;) idx = indexOf.call(seed, matched[i]), seed[idx] = !(matches[idx] = matched[i])
								}) : function(elem) {
									return fn(elem, 0, args)
								}) : fn
							}
						},
						pseudos: {
							not: markFunction(function(selector) {
								var input = [],
									results = [],
									matcher = compile(selector.replace(rtrim, "$1"));
								return matcher[expando] ? markFunction(function(seed, matches, context, xml) {
									for(var elem, unmatched = matcher(seed, null, xml, []), i = seed.length; i--;)(elem = unmatched[i]) && (seed[i] = !(matches[i] = elem))
								}) : function(elem, context, xml) {
									return input[0] = elem, matcher(input, null, xml, results), !results.pop()
								}
							}),
							has: markFunction(function(selector) {
								return function(elem) {
									return Sizzle(selector, elem).length > 0
								}
							}),
							contains: markFunction(function(text) {
								return function(elem) {
									return(elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1
								}
							}),
							lang: markFunction(function(lang) {
								return ridentifier.test(lang || "") || Sizzle.error("unsupported lang: " + lang), lang = lang.replace(runescape, funescape).toLowerCase(),
									function(elem) {
										var elemLang;
										do
											if(elemLang = documentIsXML ? elem.getAttribute("xml:lang") || elem.getAttribute("lang") : elem.lang) return elemLang = elemLang.toLowerCase(), elemLang === lang || 0 === elemLang.indexOf(lang + "-"); while ((elem = elem.parentNode) && 1 === elem.nodeType);
										return !1
									}
							}),
							target: function(elem) {
								var hash = window.location && window.location.hash;
								return hash && hash.slice(1) === elem.id
							},
							root: function(elem) {
								return elem === docElem
							},
							focus: function(elem) {
								return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex)
							},
							enabled: function(elem) {
								return elem.disabled === !1
							},
							disabled: function(elem) {
								return elem.disabled === !0
							},
							checked: function(elem) {
								var nodeName = elem.nodeName.toLowerCase();
								return "input" === nodeName && !!elem.checked || "option" === nodeName && !!elem.selected
							},
							selected: function(elem) {
								return elem.parentNode && elem.parentNode.selectedIndex, elem.selected === !0
							},
							empty: function(elem) {
								for(elem = elem.firstChild; elem; elem = elem.nextSibling)
									if(elem.nodeName > "@" || 3 === elem.nodeType || 4 === elem.nodeType) return !1;
								return !0
							},
							parent: function(elem) {
								return !Expr.pseudos.empty(elem)
							},
							header: function(elem) {
								return rheader.test(elem.nodeName)
							},
							input: function(elem) {
								return rinputs.test(elem.nodeName)
							},
							button: function(elem) {
								var name = elem.nodeName.toLowerCase();
								return "input" === name && "button" === elem.type || "button" === name
							},
							text: function(elem) {
								var attr;
								return "input" === elem.nodeName.toLowerCase() && "text" === elem.type && (null == (attr = elem.getAttribute("type")) || attr.toLowerCase() === elem.type)
							},
							first: createPositionalPseudo(function() {
								return [0]
							}),
							last: createPositionalPseudo(function(matchIndexes, length) {
								return [length - 1]
							}),
							eq: createPositionalPseudo(function(matchIndexes, length, argument) {
								return [0 > argument ? argument + length : argument]
							}),
							even: createPositionalPseudo(function(matchIndexes, length) {
								for(var i = 0; length > i; i += 2) matchIndexes.push(i);
								return matchIndexes
							}),
							odd: createPositionalPseudo(function(matchIndexes, length) {
								for(var i = 1; length > i; i += 2) matchIndexes.push(i);
								return matchIndexes
							}),
							lt: createPositionalPseudo(function(matchIndexes, length, argument) {
								for(var i = 0 > argument ? argument + length : argument; --i >= 0;) matchIndexes.push(i);
								return matchIndexes
							}),
							gt: createPositionalPseudo(function(matchIndexes, length, argument) {
								for(var i = 0 > argument ? argument + length : argument; ++i < length;) matchIndexes.push(i);
								return matchIndexes
							})
						}
					};
					for(i in {
							radio: !0,
							checkbox: !0,
							file: !0,
							password: !0,
							image: !0
						}) Expr.pseudos[i] = createInputPseudo(i);
					for(i in {
							submit: !0,
							reset: !0
						}) Expr.pseudos[i] = createButtonPseudo(i);
					compile = Sizzle.compile = function(selector, group) {
						var i, setMatchers = [],
							elementMatchers = [],
							cached = compilerCache[selector + " "];
						if(!cached) {
							for(group || (group = tokenize(selector)), i = group.length; i--;) cached = matcherFromTokens(group[i]), cached[expando] ? setMatchers.push(cached) : elementMatchers.push(cached);
							cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers))
						}
						return cached
					}, Expr.pseudos.nth = Expr.pseudos.eq, Expr.filters = setFilters.prototype = Expr.pseudos, Expr.setFilters = new setFilters, setDocument(), Sizzle.attr = jQuery.attr, jQuery.find = Sizzle, jQuery.expr = Sizzle.selectors, jQuery.expr[":"] = jQuery.expr.pseudos, jQuery.unique = Sizzle.uniqueSort, jQuery.text = Sizzle.getText, jQuery.isXMLDoc = Sizzle.isXML, jQuery.contains = Sizzle.contains
				}(window);
			var runtil = /Until$/,
				rparentsprev = /^(?:parents|prev(?:Until|All))/,
				isSimple = /^.[^:#\[\.,]*$/,
				rneedsContext = jQuery.expr.match.needsContext,
				guaranteedUnique = {
					children: !0,
					contents: !0,
					next: !0,
					prev: !0
				};
			jQuery.fn.extend({
				find: function(selector) {
					var i, ret, self, len = this.length;
					if("string" != typeof selector) return self = this, this.pushStack(jQuery(selector).filter(function() {
						for(i = 0; len > i; i++)
							if(jQuery.contains(self[i], this)) return !0
					}));
					for(ret = [], i = 0; len > i; i++) jQuery.find(selector, this[i], ret);
					return ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret), ret.selector = (this.selector ? this.selector + " " : "") + selector, ret
				},
				has: function(target) {
					var i, targets = jQuery(target, this),
						len = targets.length;
					return this.filter(function() {
						for(i = 0; len > i; i++)
							if(jQuery.contains(this, targets[i])) return !0
					})
				},
				not: function(selector) {
					return this.pushStack(winnow(this, selector, !1))
				},
				filter: function(selector) {
					return this.pushStack(winnow(this, selector, !0))
				},
				is: function(selector) {
					return !!selector && ("string" == typeof selector ? rneedsContext.test(selector) ? jQuery(selector, this.context).index(this[0]) >= 0 : jQuery.filter(selector, this).length > 0 : this.filter(selector).length > 0)
				},
				closest: function(selectors, context) {
					for(var cur, i = 0, l = this.length, ret = [], pos = rneedsContext.test(selectors) || "string" != typeof selectors ? jQuery(selectors, context || this.context) : 0; l > i; i++)
						for(cur = this[i]; cur && cur.ownerDocument && cur !== context && 11 !== cur.nodeType;) {
							if(pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) {
								ret.push(cur);
								break
							}
							cur = cur.parentNode
						}
					return this.pushStack(ret.length > 1 ? jQuery.unique(ret) : ret)
				},
				index: function(elem) {
					return elem ? "string" == typeof elem ? jQuery.inArray(this[0], jQuery(elem)) : jQuery.inArray(elem.jquery ? elem[0] : elem, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
				},
				add: function(selector, context) {
					var set = "string" == typeof selector ? jQuery(selector, context) : jQuery.makeArray(selector && selector.nodeType ? [selector] : selector),
						all = jQuery.merge(this.get(), set);
					return this.pushStack(jQuery.unique(all))
				},
				addBack: function(selector) {
					return this.add(null == selector ? this.prevObject : this.prevObject.filter(selector))
				}
			}), jQuery.fn.andSelf = jQuery.fn.addBack, jQuery.each({
				parent: function(elem) {
					var parent = elem.parentNode;
					return parent && 11 !== parent.nodeType ? parent : null
				},
				parents: function(elem) {
					return jQuery.dir(elem, "parentNode")
				},
				parentsUntil: function(elem, i, until) {
					return jQuery.dir(elem, "parentNode", until)
				},
				next: function(elem) {
					return sibling(elem, "nextSibling")
				},
				prev: function(elem) {
					return sibling(elem, "previousSibling")
				},
				nextAll: function(elem) {
					return jQuery.dir(elem, "nextSibling")
				},
				prevAll: function(elem) {
					return jQuery.dir(elem, "previousSibling")
				},
				nextUntil: function(elem, i, until) {
					return jQuery.dir(elem, "nextSibling", until)
				},
				prevUntil: function(elem, i, until) {
					return jQuery.dir(elem, "previousSibling", until)
				},
				siblings: function(elem) {
					return jQuery.sibling((elem.parentNode || {}).firstChild, elem)
				},
				children: function(elem) {
					return jQuery.sibling(elem.firstChild)
				},
				contents: function(elem) {
					return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes)
				}
			}, function(name, fn) {
				jQuery.fn[name] = function(until, selector) {
					var ret = jQuery.map(this, fn, until);
					return runtil.test(name) || (selector = until), selector && "string" == typeof selector && (ret = jQuery.filter(selector, ret)), ret = this.length > 1 && !guaranteedUnique[name] ? jQuery.unique(ret) : ret, this.length > 1 && rparentsprev.test(name) && (ret = ret.reverse()), this.pushStack(ret)
				}
			}), jQuery.extend({
				filter: function(expr, elems, not) {
					return not && (expr = ":not(" + expr + ")"), 1 === elems.length ? jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : jQuery.find.matches(expr, elems)
				},
				dir: function(elem, dir, until) {
					for(var matched = [], cur = elem[dir]; cur && 9 !== cur.nodeType && (until === undefined || 1 !== cur.nodeType || !jQuery(cur).is(until));) 1 === cur.nodeType && matched.push(cur), cur = cur[dir];
					return matched
				},
				sibling: function(n, elem) {
					for(var r = []; n; n = n.nextSibling) 1 === n.nodeType && n !== elem && r.push(n);
					return r
				}
			});
			var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
				rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
				rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
				rleadingWhitespace = /^\s+/,
				rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
				rtagName = /<([\w:]+)/,
				rtbody = /<tbody/i,
				rhtml = /<|&#?\w+;/,
				rnoInnerhtml = /<(?:script|style|link)/i,
				manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
				rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
				rscriptType = /^$|\/(?:java|ecma)script/i,
				rscriptTypeMasked = /^true\/(.*)/,
				rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
				wrapMap = {
					option: [1, "<select multiple='multiple'>", "</select>"],
					legend: [1, "<fieldset>", "</fieldset>"],
					area: [1, "<map>", "</map>"],
					param: [1, "<object>", "</object>"],
					thead: [1, "<table>", "</table>"],
					tr: [2, "<table><tbody>", "</tbody></table>"],
					col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
					td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
					_default: jQuery.support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
				},
				safeFragment = createSafeFragment(document),
				fragmentDiv = safeFragment.appendChild(document.createElement("div"));
			wrapMap.optgroup = wrapMap.option, wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead, wrapMap.th = wrapMap.td, jQuery.fn.extend({
				text: function(value) {
					return jQuery.access(this, function(value) {
						return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value))
					}, null, value, arguments.length)
				},
				wrapAll: function(html) {
					if(jQuery.isFunction(html)) return this.each(function(i) {
						jQuery(this).wrapAll(html.call(this, i))
					});
					if(this[0]) {
						var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(!0);
						this[0].parentNode && wrap.insertBefore(this[0]), wrap.map(function() {
							for(var elem = this; elem.firstChild && 1 === elem.firstChild.nodeType;) elem = elem.firstChild;
							return elem
						}).append(this)
					}
					return this
				},
				wrapInner: function(html) {
					return jQuery.isFunction(html) ? this.each(function(i) {
						jQuery(this).wrapInner(html.call(this, i))
					}) : this.each(function() {
						var self = jQuery(this),
							contents = self.contents();
						contents.length ? contents.wrapAll(html) : self.append(html)
					})
				},
				wrap: function(html) {
					var isFunction = jQuery.isFunction(html);
					return this.each(function(i) {
						jQuery(this).wrapAll(isFunction ? html.call(this, i) : html)
					})
				},
				unwrap: function() {
					return this.parent().each(function() {
						jQuery.nodeName(this, "body") || jQuery(this).replaceWith(this.childNodes)
					}).end()
				},
				append: function() {
					return this.domManip(arguments, !0, function(elem) {
						(1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.appendChild(elem)
					})
				},
				prepend: function() {
					return this.domManip(arguments, !0, function(elem) {
						(1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.insertBefore(elem, this.firstChild)
					})
				},
				before: function() {
					return this.domManip(arguments, !1, function(elem) {
						this.parentNode && this.parentNode.insertBefore(elem, this)
					})
				},
				after: function() {
					return this.domManip(arguments, !1, function(elem) {
						this.parentNode && this.parentNode.insertBefore(elem, this.nextSibling)
					})
				},
				remove: function(selector, keepData) {
					for(var elem, i = 0; null != (elem = this[i]); i++)(!selector || jQuery.filter(selector, [elem]).length > 0) && (keepData || 1 !== elem.nodeType || jQuery.cleanData(getAll(elem)), elem.parentNode && (keepData && jQuery.contains(elem.ownerDocument, elem) && setGlobalEval(getAll(elem, "script")), elem.parentNode.removeChild(elem)));
					return this
				},
				empty: function() {
					for(var elem, i = 0; null != (elem = this[i]); i++) {
						for(1 === elem.nodeType && jQuery.cleanData(getAll(elem, !1)); elem.firstChild;) elem.removeChild(elem.firstChild);
						elem.options && jQuery.nodeName(elem, "select") && (elem.options.length = 0)
					}
					return this
				},
				clone: function(dataAndEvents, deepDataAndEvents) {
					return dataAndEvents = null == dataAndEvents ? !1 : dataAndEvents, deepDataAndEvents = null == deepDataAndEvents ? dataAndEvents : deepDataAndEvents, this.map(function() {
						return jQuery.clone(this, dataAndEvents, deepDataAndEvents)
					})
				},
				html: function(value) {
					return jQuery.access(this, function(value) {
						var elem = this[0] || {},
							i = 0,
							l = this.length;
						if(value === undefined) return 1 === elem.nodeType ? elem.innerHTML.replace(rinlinejQuery, "") : undefined;
						if("string" == typeof value && !rnoInnerhtml.test(value) && (jQuery.support.htmlSerialize || !rnoshimcache.test(value)) && (jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
							value = value.replace(rxhtmlTag, "<$1></$2>");
							try {
								for(; l > i; i++) elem = this[i] || {}, 1 === elem.nodeType && (jQuery.cleanData(getAll(elem, !1)), elem.innerHTML = value);
								elem = 0
							} catch(e) {}
						}
						elem && this.empty().append(value)
					}, null, value, arguments.length)
				},
				replaceWith: function(value) {
					var isFunc = jQuery.isFunction(value);
					return isFunc || "string" == typeof value || (value = jQuery(value).not(this).detach()), this.domManip([value], !0, function(elem) {
						var next = this.nextSibling,
							parent = this.parentNode;
						parent && (jQuery(this).remove(), parent.insertBefore(elem, next))
					})
				},
				detach: function(selector) {
					return this.remove(selector, !0)
				},
				domManip: function(args, table, callback) {
					args = core_concat.apply([], args);
					var first, node, hasScripts, scripts, doc, fragment, i = 0,
						l = this.length,
						set = this,
						iNoClone = l - 1,
						value = args[0],
						isFunction = jQuery.isFunction(value);
					if(isFunction || !(1 >= l || "string" != typeof value || jQuery.support.checkClone) && rchecked.test(value)) return this.each(function(index) {
						var self = set.eq(index);
						isFunction && (args[0] = value.call(this, index, table ? self.html() : undefined)), self.domManip(args, table, callback)
					});
					if(l && (fragment = jQuery.buildFragment(args, this[0].ownerDocument, !1, this), first = fragment.firstChild, 1 === fragment.childNodes.length && (fragment = first), first)) {
						for(table = table && jQuery.nodeName(first, "tr"), scripts = jQuery.map(getAll(fragment, "script"), disableScript), hasScripts = scripts.length; l > i; i++) node = fragment, i !== iNoClone && (node = jQuery.clone(node, !0, !0), hasScripts && jQuery.merge(scripts, getAll(node, "script"))), callback.call(table && jQuery.nodeName(this[i], "table") ? findOrAppend(this[i], "tbody") : this[i], node, i);
						if(hasScripts)
							for(doc = scripts[scripts.length - 1].ownerDocument, jQuery.map(scripts, restoreScript), i = 0; hasScripts > i; i++) node = scripts[i], rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node) && (node.src ? jQuery.ajax({
								url: node.src,
								type: "GET",
								dataType: "script",
								async: !1,
								global: !1,
								"throws": !0
							}) : jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, "")));
						fragment = first = null
					}
					return this
				}
			}), jQuery.each({
				appendTo: "append",
				prependTo: "prepend",
				insertBefore: "before",
				insertAfter: "after",
				replaceAll: "replaceWith"
			}, function(name, original) {
				jQuery.fn[name] = function(selector) {
					for(var elems, i = 0, ret = [], insert = jQuery(selector), last = insert.length - 1; last >= i; i++) elems = i === last ? this : this.clone(!0), jQuery(insert[i])[original](elems), core_push.apply(ret, elems.get());
					return this.pushStack(ret)
				}
			}), jQuery.extend({
				clone: function(elem, dataAndEvents, deepDataAndEvents) {
					var destElements, node, clone, i, srcElements, inPage = jQuery.contains(elem.ownerDocument, elem);
					if(jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">") ? clone = elem.cloneNode(!0) : (fragmentDiv.innerHTML = elem.outerHTML, fragmentDiv.removeChild(clone = fragmentDiv.firstChild)), !(jQuery.support.noCloneEvent && jQuery.support.noCloneChecked || 1 !== elem.nodeType && 11 !== elem.nodeType || jQuery.isXMLDoc(elem)))
						for(destElements = getAll(clone), srcElements = getAll(elem), i = 0; null != (node = srcElements[i]); ++i) destElements[i] && fixCloneNodeIssues(node, destElements[i]);
					if(dataAndEvents)
						if(deepDataAndEvents)
							for(srcElements = srcElements || getAll(elem), destElements = destElements || getAll(clone), i = 0; null != (node = srcElements[i]); i++) cloneCopyEvent(node, destElements[i]);
						else cloneCopyEvent(elem, clone);
					return destElements = getAll(clone, "script"), destElements.length > 0 && setGlobalEval(destElements, !inPage && getAll(elem, "script")), destElements = srcElements = node = null, clone
				},
				buildFragment: function(elems, context, scripts, selection) {
					for(var j, elem, contains, tmp, tag, tbody, wrap, l = elems.length, safe = createSafeFragment(context), nodes = [], i = 0; l > i; i++)
						if(elem = elems[i], elem || 0 === elem)
							if("object" === jQuery.type(elem)) jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
							else if(rhtml.test(elem)) {
						for(tmp = tmp || safe.appendChild(context.createElement("div")), tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(), wrap = wrapMap[tag] || wrapMap._default, tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1></$2>") + wrap[2], j = wrap[0]; j--;) tmp = tmp.lastChild;
						if(!jQuery.support.leadingWhitespace && rleadingWhitespace.test(elem) && nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0])), !jQuery.support.tbody)
							for(elem = "table" !== tag || rtbody.test(elem) ? "<table>" !== wrap[1] || rtbody.test(elem) ? 0 : tmp : tmp.firstChild, j = elem && elem.childNodes.length; j--;) jQuery.nodeName(tbody = elem.childNodes[j], "tbody") && !tbody.childNodes.length && elem.removeChild(tbody);
						for(jQuery.merge(nodes, tmp.childNodes), tmp.textContent = ""; tmp.firstChild;) tmp.removeChild(tmp.firstChild);
						tmp = safe.lastChild
					} else nodes.push(context.createTextNode(elem));
					for(tmp && safe.removeChild(tmp), jQuery.support.appendChecked || jQuery.grep(getAll(nodes, "input"), fixDefaultChecked), i = 0; elem = nodes[i++];)
						if((!selection || -1 === jQuery.inArray(elem, selection)) && (contains = jQuery.contains(elem.ownerDocument, elem), tmp = getAll(safe.appendChild(elem), "script"), contains && setGlobalEval(tmp), scripts))
							for(j = 0; elem = tmp[j++];) rscriptType.test(elem.type || "") && scripts.push(elem);
					return tmp = null, safe
				},
				cleanData: function(elems, acceptData) {
					for(var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, deleteExpando = jQuery.support.deleteExpando, special = jQuery.event.special; null != (elem = elems[i]); i++)
						if((acceptData || jQuery.acceptData(elem)) && (id = elem[internalKey], data = id && cache[id])) {
							if(data.events)
								for(type in data.events) special[type] ? jQuery.event.remove(elem, type) : jQuery.removeEvent(elem, type, data.handle);
							cache[id] && (delete cache[id], deleteExpando ? delete elem[internalKey] : typeof elem.removeAttribute !== core_strundefined ? elem.removeAttribute(internalKey) : elem[internalKey] = null, core_deletedIds.push(id))
						}
				}
			});
			var iframe, getStyles, curCSS, ralpha = /alpha\([^)]*\)/i,
				ropacity = /opacity\s*=\s*([^)]*)/,
				rposition = /^(top|right|bottom|left)$/,
				rdisplayswap = /^(none|table(?!-c[ea]).+)/,
				rmargin = /^margin/,
				rnumsplit = new RegExp("^(" + core_pnum + ")(.*)$", "i"),
				rnumnonpx = new RegExp("^(" + core_pnum + ")(?!px)[a-z%]+$", "i"),
				rrelNum = new RegExp("^([+-])=(" + core_pnum + ")", "i"),
				elemdisplay = {
					BODY: "block"
				},
				cssShow = {
					position: "absolute",
					visibility: "hidden",
					display: "block"
				},
				cssNormalTransform = {
					letterSpacing: 0,
					fontWeight: 400
				},
				cssExpand = ["Top", "Right", "Bottom", "Left"],
				cssPrefixes = ["Webkit", "O", "Moz", "ms"];
			jQuery.fn.extend({
				css: function(name, value) {
					return jQuery.access(this, function(elem, name, value) {
						var len, styles, map = {},
							i = 0;
						if(jQuery.isArray(name)) {
							for(styles = getStyles(elem), len = name.length; len > i; i++) map[name[i]] = jQuery.css(elem, name[i], !1, styles);
							return map
						}
						return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name)
					}, name, value, arguments.length > 1)
				},
				show: function() {
					return showHide(this, !0)
				},
				hide: function() {
					return showHide(this)
				},
				toggle: function(state) {
					var bool = "boolean" == typeof state;
					return this.each(function() {
						(bool ? state : isHidden(this)) ? jQuery(this).show(): jQuery(this).hide()
					})
				}
			}), jQuery.extend({
				cssHooks: {
					opacity: {
						get: function(elem, computed) {
							if(computed) {
								var ret = curCSS(elem, "opacity");
								return "" === ret ? "1" : ret
							}
						}
					}
				},
				cssNumber: {
					columnCount: !0,
					fillOpacity: !0,
					fontWeight: !0,
					lineHeight: !0,
					opacity: !0,
					orphans: !0,
					widows: !0,
					zIndex: !0,
					zoom: !0
				},
				cssProps: {
					"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
				},
				style: function(elem, name, value, extra) {
					if(elem && 3 !== elem.nodeType && 8 !== elem.nodeType && elem.style) {
						var ret, type, hooks, origName = jQuery.camelCase(name),
							style = elem.style;
						if(name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(style, origName)), hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName], value === undefined) return hooks && "get" in hooks && (ret = hooks.get(elem, !1, extra)) !== undefined ? ret : style[name];
						if(type = typeof value, "string" === type && (ret = rrelNum.exec(value)) && (value = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name)), type = "number"), !(null == value || "number" === type && isNaN(value) || ("number" !== type || jQuery.cssNumber[origName] || (value += "px"), jQuery.support.clearCloneStyle || "" !== value || 0 !== name.indexOf("background") || (style[name] = "inherit"), hooks && "set" in hooks && (value = hooks.set(elem, value, extra)) === undefined))) try {
							style[name] = value
						} catch(e) {}
					}
				},
				css: function(elem, name, extra, styles) {
					var num, val, hooks, origName = jQuery.camelCase(name);
					return name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName)), hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName], hooks && "get" in hooks && (val = hooks.get(elem, !0, extra)), val === undefined && (val = curCSS(elem, name, styles)), "normal" === val && name in cssNormalTransform && (val = cssNormalTransform[name]), "" === extra || extra ? (num = parseFloat(val), extra === !0 || jQuery.isNumeric(num) ? num || 0 : val) : val
				},
				swap: function(elem, options, callback, args) {
					var ret, name, old = {};
					for(name in options) old[name] = elem.style[name], elem.style[name] = options[name];
					ret = callback.apply(elem, args || []);
					for(name in options) elem.style[name] = old[name];
					return ret
				}
			}), window.getComputedStyle ? (getStyles = function(elem) {
				return window.getComputedStyle(elem, null)
			}, curCSS = function(elem, name, _computed) {
				var width, minWidth, maxWidth, computed = _computed || getStyles(elem),
					ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined,
					style = elem.style;
				return computed && ("" !== ret || jQuery.contains(elem.ownerDocument, elem) || (ret = jQuery.style(elem, name)), rnumnonpx.test(ret) && rmargin.test(name) && (width = style.width, minWidth = style.minWidth, maxWidth = style.maxWidth, style.minWidth = style.maxWidth = style.width = ret, ret = computed.width, style.width = width, style.minWidth = minWidth, style.maxWidth = maxWidth)), ret
			}) : document.documentElement.currentStyle && (getStyles = function(elem) {
				return elem.currentStyle
			}, curCSS = function(elem, name, _computed) {
				var left, rs, rsLeft, computed = _computed || getStyles(elem),
					ret = computed ? computed[name] : undefined,
					style = elem.style;
				return null == ret && style && style[name] && (ret = style[name]), rnumnonpx.test(ret) && !rposition.test(name) && (left = style.left, rs = elem.runtimeStyle, rsLeft = rs && rs.left, rsLeft && (rs.left = elem.currentStyle.left), style.left = "fontSize" === name ? "1em" : ret, ret = style.pixelLeft + "px", style.left = left, rsLeft && (rs.left = rsLeft)), "" === ret ? "auto" : ret
			}), jQuery.each(["height", "width"], function(i, name) {
				jQuery.cssHooks[name] = {
					get: function(elem, computed, extra) {
						return computed ? 0 === elem.offsetWidth && rdisplayswap.test(jQuery.css(elem, "display")) ? jQuery.swap(elem, cssShow, function() {
							return getWidthOrHeight(elem, name, extra)
						}) : getWidthOrHeight(elem, name, extra) : void 0
					},
					set: function(elem, value, extra) {
						var styles = extra && getStyles(elem);
						return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, jQuery.support.boxSizing && "border-box" === jQuery.css(elem, "boxSizing", !1, styles), styles) : 0)
					}
				}
			}), jQuery.support.opacity || (jQuery.cssHooks.opacity = {
				get: function(elem, computed) {
					return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : computed ? "1" : ""
				},
				set: function(elem, value) {
					var style = elem.style,
						currentStyle = elem.currentStyle,
						opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + 100 * value + ")" : "",
						filter = currentStyle && currentStyle.filter || style.filter || "";
					style.zoom = 1, (value >= 1 || "" === value) && "" === jQuery.trim(filter.replace(ralpha, "")) && style.removeAttribute && (style.removeAttribute("filter"), "" === value || currentStyle && !currentStyle.filter) || (style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity)
				}
			}), jQuery(function() {
				jQuery.support.reliableMarginRight || (jQuery.cssHooks.marginRight = {
					get: function(elem, computed) {
						return computed ? jQuery.swap(elem, {
							display: "inline-block"
						}, curCSS, [elem, "marginRight"]) : void 0
					}
				}), !jQuery.support.pixelPosition && jQuery.fn.position && jQuery.each(["top", "left"], function(i, prop) {
					jQuery.cssHooks[prop] = {
						get: function(elem, computed) {
							return computed ? (computed = curCSS(elem, prop), rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed) : void 0
						}
					}
				})
			}), jQuery.expr && jQuery.expr.filters && (jQuery.expr.filters.hidden = function(elem) {
				return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 || !jQuery.support.reliableHiddenOffsets && "none" === (elem.style && elem.style.display || jQuery.css(elem, "display"))
			}, jQuery.expr.filters.visible = function(elem) {
				return !jQuery.expr.filters.hidden(elem)
			}), jQuery.each({
				margin: "",
				padding: "",
				border: "Width"
			}, function(prefix, suffix) {
				jQuery.cssHooks[prefix + suffix] = {
					expand: function(value) {
						for(var i = 0, expanded = {}, parts = "string" == typeof value ? value.split(" ") : [value]; 4 > i; i++) expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
						return expanded
					}
				}, rmargin.test(prefix) || (jQuery.cssHooks[prefix + suffix].set = setPositiveNumber)
			});
			var r20 = /%20/g,
				rbracket = /\[\]$/,
				rCRLF = /\r?\n/g,
				rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
				rsubmittable = /^(?:input|select|textarea|keygen)/i;
			jQuery.fn.extend({
				serialize: function() {
					return jQuery.param(this.serializeArray())
				},
				serializeArray: function() {
					return this.map(function() {
						var elements = jQuery.prop(this, "elements");
						return elements ? jQuery.makeArray(elements) : this
					}).filter(function() {
						var type = this.type;
						return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !manipulation_rcheckableType.test(type))
					}).map(function(i, elem) {
						var val = jQuery(this).val();
						return null == val ? null : jQuery.isArray(val) ? jQuery.map(val, function(val) {
							return {
								name: elem.name,
								value: val.replace(rCRLF, "\r\n")
							}
						}) : {
							name: elem.name,
							value: val.replace(rCRLF, "\r\n")
						}
					}).get()
				}
			}), jQuery.param = function(a, traditional) {
				var prefix, s = [],
					add = function(key, value) {
						value = jQuery.isFunction(value) ? value() : null == value ? "" : value, s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value)
					};
				if(traditional === undefined && (traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional), jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) jQuery.each(a, function() {
					add(this.name, this.value)
				});
				else
					for(prefix in a) buildParams(prefix, a[prefix], traditional, add);
				return s.join("&").replace(r20, "+")
			}, jQuery.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function(i, name) {
				jQuery.fn[name] = function(data, fn) {
					return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name)
				}
			}), jQuery.fn.hover = function(fnOver, fnOut) {
				return this.mouseenter(fnOver).mouseleave(fnOut || fnOver)
			};
			var ajaxLocParts, ajaxLocation, ajax_nonce = jQuery.now(),
				ajax_rquery = /\?/,
				rhash = /#.*$/,
				rts = /([?&])_=[^&]*/,
				rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm,
				rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
				rnoContent = /^(?:GET|HEAD)$/,
				rprotocol = /^\/\//,
				rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
				_load = jQuery.fn.load,
				prefilters = {},
				transports = {},
				allTypes = "*/".concat("*");
			try {
				ajaxLocation = location.href
			} catch(e) {
				ajaxLocation = document.createElement("a"), ajaxLocation.href = "", ajaxLocation = ajaxLocation.href
			}
			ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [], jQuery.fn.load = function(url, params, callback) {
				if("string" != typeof url && _load) return _load.apply(this, arguments);
				var selector, response, type, self = this,
					off = url.indexOf(" ");
				return off >= 0 && (selector = url.slice(off, url.length), url = url.slice(0, off)), jQuery.isFunction(params) ? (callback = params, params = undefined) : params && "object" == typeof params && (type = "POST"), self.length > 0 && jQuery.ajax({
					url: url,
					type: type,
					dataType: "html",
					data: params
				}).done(function(responseText) {
					response = arguments, self.html(selector ? jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : responseText)
				}).complete(callback && function(jqXHR, status) {
					self.each(callback, response || [jqXHR.responseText, status, jqXHR])
				}), this
			}, jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(i, type) {
				jQuery.fn[type] = function(fn) {
					return this.on(type, fn)
				}
			}), jQuery.each(["get", "post"], function(i, method) {
				jQuery[method] = function(url, data, callback, type) {
					return jQuery.isFunction(data) && (type = type || callback, callback = data, data = undefined), jQuery.ajax({
						url: url,
						type: method,
						dataType: type,
						data: data,
						success: callback
					})
				}
			}), jQuery.extend({
				active: 0,
				lastModified: {},
				etag: {},
				ajaxSettings: {
					url: ajaxLocation,
					type: "GET",
					isLocal: rlocalProtocol.test(ajaxLocParts[1]),
					global: !0,
					processData: !0,
					async: !0,
					contentType: "application/x-www-form-urlencoded; charset=UTF-8",
					accepts: {
						"*": allTypes,
						text: "text/plain",
						html: "text/html",
						xml: "application/xml, text/xml",
						json: "application/json, text/javascript"
					},
					contents: {
						xml: /xml/,
						html: /html/,
						json: /json/
					},
					responseFields: {
						xml: "responseXML",
						text: "responseText"
					},
					converters: {
						"* text": window.String,
						"text html": !0,
						"text json": jQuery.parseJSON,
						"text xml": jQuery.parseXML
					},
					flatOptions: {
						url: !0,
						context: !0
					}
				},
				ajaxSetup: function(target, settings) {
					return settings ? ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : ajaxExtend(jQuery.ajaxSettings, target)
				},
				ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
				ajaxTransport: addToPrefiltersOrTransports(transports),
				ajax: function(url, options) {
					function done(status, nativeStatusText, responses, headers) {
						var isSuccess, success, error, response, modified, statusText = nativeStatusText;
						2 !== state && (state = 2, timeoutTimer && clearTimeout(timeoutTimer), transport = undefined, responseHeadersString = headers || "", jqXHR.readyState = status > 0 ? 4 : 0, responses && (response = ajaxHandleResponses(s, jqXHR, responses)), status >= 200 && 300 > status || 304 === status ? (s.ifModified && (modified = jqXHR.getResponseHeader("Last-Modified"), modified && (jQuery.lastModified[cacheURL] = modified), modified = jqXHR.getResponseHeader("etag"), modified && (jQuery.etag[cacheURL] = modified)), 204 === status ? (isSuccess = !0, statusText = "nocontent") : 304 === status ? (isSuccess = !0, statusText = "notmodified") : (isSuccess = ajaxConvert(s, response), statusText = isSuccess.state, success = isSuccess.data, error = isSuccess.error, isSuccess = !error)) : (error = statusText, (status || !statusText) && (statusText = "error", 0 > status && (status = 0))), jqXHR.status = status, jqXHR.statusText = (nativeStatusText || statusText) + "", isSuccess ? deferred.resolveWith(callbackContext, [success, statusText, jqXHR]) : deferred.rejectWith(callbackContext, [jqXHR, statusText, error]), jqXHR.statusCode(statusCode), statusCode = undefined, fireGlobals && globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]), completeDeferred.fireWith(callbackContext, [jqXHR, statusText]), fireGlobals && (globalEventContext.trigger("ajaxComplete", [jqXHR, s]), --jQuery.active || jQuery.event.trigger("ajaxStop")))
					}
					"object" == typeof url && (options = url, url = undefined), options = options || {};
					var parts, i, cacheURL, responseHeadersString, timeoutTimer, fireGlobals, transport, responseHeaders, s = jQuery.ajaxSetup({}, options),
						callbackContext = s.context || s,
						globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,
						deferred = jQuery.Deferred(),
						completeDeferred = jQuery.Callbacks("once memory"),
						statusCode = s.statusCode || {},
						requestHeaders = {},
						requestHeadersNames = {},
						state = 0,
						strAbort = "canceled",
						jqXHR = {
							readyState: 0,
							getResponseHeader: function(key) {
								var match;
								if(2 === state) {
									if(!responseHeaders)
										for(responseHeaders = {}; match = rheaders.exec(responseHeadersString);) responseHeaders[match[1].toLowerCase()] = match[2];
									match = responseHeaders[key.toLowerCase()]
								}
								return null == match ? null : match
							},
							getAllResponseHeaders: function() {
								return 2 === state ? responseHeadersString : null
							},
							setRequestHeader: function(name, value) {
								var lname = name.toLowerCase();
								return state || (name = requestHeadersNames[lname] = requestHeadersNames[lname] || name, requestHeaders[name] = value), this
							},
							overrideMimeType: function(type) {
								return state || (s.mimeType = type), this
							},
							statusCode: function(map) {
								var code;
								if(map)
									if(2 > state)
										for(code in map) statusCode[code] = [statusCode[code], map[code]];
									else jqXHR.always(map[jqXHR.status]);
								return this
							},
							abort: function(statusText) {
								var finalText = statusText || strAbort;
								return transport && transport.abort(finalText), done(0, finalText), this
							}
						};
					if(deferred.promise(jqXHR).complete = completeDeferred.add, jqXHR.success = jqXHR.done, jqXHR.error = jqXHR.fail, s.url = ((url || s.url || ajaxLocation) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//"), s.type = options.method || options.type || s.method || s.type, s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(core_rnotwhite) || [""], null == s.crossDomain && (parts = rurl.exec(s.url.toLowerCase()), s.crossDomain = !(!parts || parts[1] === ajaxLocParts[1] && parts[2] === ajaxLocParts[2] && (parts[3] || ("http:" === parts[1] ? 80 : 443)) == (ajaxLocParts[3] || ("http:" === ajaxLocParts[1] ? 80 : 443)))), s.data && s.processData && "string" != typeof s.data && (s.data = jQuery.param(s.data, s.traditional)), inspectPrefiltersOrTransports(prefilters, s, options, jqXHR), 2 === state) return jqXHR;
					fireGlobals = s.global, fireGlobals && 0 === jQuery.active++ && jQuery.event.trigger("ajaxStart"), s.type = s.type.toUpperCase(), s.hasContent = !rnoContent.test(s.type), cacheURL = s.url, s.hasContent || (s.data && (cacheURL = s.url += (ajax_rquery.test(cacheURL) ? "&" : "?") + s.data, delete s.data), s.cache === !1 && (s.url = rts.test(cacheURL) ? cacheURL.replace(rts, "$1_=" + ajax_nonce++) : cacheURL + (ajax_rquery.test(cacheURL) ? "&" : "?") + "_=" + ajax_nonce++)), s.ifModified && (jQuery.lastModified[cacheURL] && jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]), jQuery.etag[cacheURL] && jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL])), (s.data && s.hasContent && s.contentType !== !1 || options.contentType) && jqXHR.setRequestHeader("Content-Type", s.contentType), jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + ("*" !== s.dataTypes[0] ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);
					for(i in s.headers) jqXHR.setRequestHeader(i, s.headers[i]);
					if(s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === !1 || 2 === state)) return jqXHR.abort();
					strAbort = "abort";
					for(i in {
							success: 1,
							error: 1,
							complete: 1
						}) jqXHR[i](s[i]);
					if(transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR)) {
						jqXHR.readyState = 1, fireGlobals && globalEventContext.trigger("ajaxSend", [jqXHR, s]), s.async && s.timeout > 0 && (timeoutTimer = setTimeout(function() {
							jqXHR.abort("timeout")
						}, s.timeout));
						try {
							state = 1, transport.send(requestHeaders, done)
						} catch(e) {
							if(!(2 > state)) throw e;
							done(-1, e)
						}
					} else done(-1, "No Transport");
					return jqXHR
				},
				getScript: function(url, callback) {
					return jQuery.get(url, undefined, callback, "script")
				},
				getJSON: function(url, data, callback) {
					return jQuery.get(url, data, callback, "json")
				}
			}), jQuery.ajaxSetup({
				accepts: {
					script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
				},
				contents: {
					script: /(?:java|ecma)script/
				},
				converters: {
					"text script": function(text) {
						return jQuery.globalEval(text), text
					}
				}
			}), jQuery.ajaxPrefilter("script", function(s) {
				s.cache === undefined && (s.cache = !1), s.crossDomain && (s.type = "GET", s.global = !1)
			}), jQuery.ajaxTransport("script", function(s) {
				if(s.crossDomain) {
					var script, head = document.head || jQuery("head")[0] || document.documentElement;
					return {
						send: function(_, callback) {
							script = document.createElement("script"), script.async = !0, s.scriptCharset && (script.charset = s.scriptCharset), script.src = s.url, script.onload = script.onreadystatechange = function(_, isAbort) {
								(isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) && (script.onload = script.onreadystatechange = null, script.parentNode && script.parentNode.removeChild(script), script = null, isAbort || callback(200, "success"))
							}, head.insertBefore(script, head.firstChild)
						},
						abort: function() {
							script && script.onload(undefined, !0)
						}
					}
				}
			});
			var oldCallbacks = [],
				rjsonp = /(=)\?(?=&|$)|\?\?/;
			jQuery.ajaxSetup({
				jsonp: "callback",
				jsonpCallback: function() {
					var callback = oldCallbacks.pop() || jQuery.expando + "_" + ajax_nonce++;
					return this[callback] = !0, callback
				}
			}), jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {
				var callbackName, overwritten, responseContainer, jsonProp = s.jsonp !== !1 && (rjsonp.test(s.url) ? "url" : "string" == typeof s.data && !(s.contentType || "").indexOf("application/x-www-form-urlencoded") && rjsonp.test(s.data) && "data");
				return jsonProp || "jsonp" === s.dataTypes[0] ? (callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback, jsonProp ? s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName) : s.jsonp !== !1 && (s.url += (ajax_rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName), s.converters["script json"] = function() {
					return responseContainer || jQuery.error(callbackName + " was not called"), responseContainer[0]
				}, s.dataTypes[0] = "json", overwritten = window[callbackName], window[callbackName] = function() {
					responseContainer = arguments
				}, jqXHR.always(function() {
					window[callbackName] = overwritten, s[callbackName] && (s.jsonpCallback = originalSettings.jsonpCallback, oldCallbacks.push(callbackName)), responseContainer && jQuery.isFunction(overwritten) && overwritten(responseContainer[0]), responseContainer = overwritten = undefined
				}), "script") : void 0
			});
			var xhrCallbacks, xhrSupported, xhrId = 0,
				xhrOnUnloadAbort = window.ActiveXObject && function() {
					var key;
					for(key in xhrCallbacks) xhrCallbacks[key](undefined, !0)
				};
			jQuery.ajaxSettings.xhr = window.ActiveXObject ? function() {
				return !this.isLocal && createStandardXHR() || createActiveXHR()
			} : createStandardXHR, xhrSupported = jQuery.ajaxSettings.xhr(), jQuery.support.cors = !!xhrSupported && "withCredentials" in xhrSupported, xhrSupported = jQuery.support.ajax = !!xhrSupported, xhrSupported && jQuery.ajaxTransport(function(s) {
				if(!s.crossDomain || jQuery.support.cors) {
					var callback;
					return {
						send: function(headers, complete) {
							var handle, i, xhr = s.xhr();
							if(s.username ? xhr.open(s.type, s.url, s.async, s.username, s.password) : xhr.open(s.type, s.url, s.async), s.xhrFields)
								for(i in s.xhrFields) xhr[i] = s.xhrFields[i];
							s.mimeType && xhr.overrideMimeType && xhr.overrideMimeType(s.mimeType), s.crossDomain || headers["X-Requested-With"] || (headers["X-Requested-With"] = "XMLHttpRequest");
							try {
								for(i in headers) xhr.setRequestHeader(i, headers[i])
							} catch(err) {}
							xhr.send(s.hasContent && s.data || null), callback = function(_, isAbort) {
								var status, responseHeaders, statusText, responses;
								try {
									if(callback && (isAbort || 4 === xhr.readyState))
										if(callback = undefined, handle && (xhr.onreadystatechange = jQuery.noop, xhrOnUnloadAbort && delete xhrCallbacks[handle]), isAbort) 4 !== xhr.readyState && xhr.abort();
										else {
											responses = {}, status = xhr.status, responseHeaders = xhr.getAllResponseHeaders(), "string" == typeof xhr.responseText && (responses.text = xhr.responseText);
											try {
												statusText = xhr.statusText
											} catch(e) {
												statusText = ""
											}
											status || !s.isLocal || s.crossDomain ? 1223 === status && (status = 204) : status = responses.text ? 200 : 404
										}
								} catch(firefoxAccessException) {
									isAbort || complete(-1, firefoxAccessException)
								}
								responses && complete(status, statusText, responses, responseHeaders)
							}, s.async ? 4 === xhr.readyState ? setTimeout(callback) : (handle = ++xhrId, xhrOnUnloadAbort && (xhrCallbacks || (xhrCallbacks = {}, jQuery(window).unload(xhrOnUnloadAbort)), xhrCallbacks[handle] = callback), xhr.onreadystatechange = callback) : callback()
						},
						abort: function() {
							callback && callback(undefined, !0)
						}
					}
				}
			});
			var fxNow, timerId, rfxtypes = /^(?:toggle|show|hide)$/,
				rfxnum = new RegExp("^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i"),
				rrun = /queueHooks$/,
				animationPrefilters = [defaultPrefilter],
				tweeners = {
					"*": [function(prop, value) {
						var end, unit, tween = this.createTween(prop, value),
							parts = rfxnum.exec(value),
							target = tween.cur(),
							start = +target || 0,
							scale = 1,
							maxIterations = 20;
						if(parts) {
							if(end = +parts[2], unit = parts[3] || (jQuery.cssNumber[prop] ? "" : "px"), "px" !== unit && start) {
								start = jQuery.css(tween.elem, prop, !0) || end || 1;
								do scale = scale || ".5", start /= scale, jQuery.style(tween.elem, prop, start + unit); while (scale !== (scale = tween.cur() / target) && 1 !== scale && --maxIterations)
							}
							tween.unit = unit, tween.start = start, tween.end = parts[1] ? start + (parts[1] + 1) * end : end
						}
						return tween
					}]
				};
			jQuery.Animation = jQuery.extend(Animation, {
				tweener: function(props, callback) {
					jQuery.isFunction(props) ? (callback = props, props = ["*"]) : props = props.split(" ");
					for(var prop, index = 0, length = props.length; length > index; index++) prop = props[index], tweeners[prop] = tweeners[prop] || [], tweeners[prop].unshift(callback)
				},
				prefilter: function(callback, prepend) {
					prepend ? animationPrefilters.unshift(callback) : animationPrefilters.push(callback)
				}
			}), jQuery.Tween = Tween, Tween.prototype = {
				constructor: Tween,
				init: function(elem, options, prop, end, easing, unit) {
					this.elem = elem, this.prop = prop, this.easing = easing || "swing", this.options = options, this.start = this.now = this.cur(), this.end = end, this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px")
				},
				cur: function() {
					var hooks = Tween.propHooks[this.prop];
					return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this)
				},
				run: function(percent) {
					var eased, hooks = Tween.propHooks[this.prop];
					return this.options.duration ? this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration) : this.pos = eased = percent, this.now = (this.end - this.start) * eased + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), hooks && hooks.set ? hooks.set(this) : Tween.propHooks._default.set(this), this
				}
			}, Tween.prototype.init.prototype = Tween.prototype, Tween.propHooks = {
				_default: {
					get: function(tween) {
						var result;
						return null == tween.elem[tween.prop] || tween.elem.style && null != tween.elem.style[tween.prop] ? (result = jQuery.css(tween.elem, tween.prop, ""), result && "auto" !== result ? result : 0) : tween.elem[tween.prop]
					},
					set: function(tween) {
						jQuery.fx.step[tween.prop] ? jQuery.fx.step[tween.prop](tween) : tween.elem.style && (null != tween.elem.style[jQuery.cssProps[tween.prop]] || jQuery.cssHooks[tween.prop]) ? jQuery.style(tween.elem, tween.prop, tween.now + tween.unit) : tween.elem[tween.prop] = tween.now
					}
				}
			}, Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
				set: function(tween) {
					tween.elem.nodeType && tween.elem.parentNode && (tween.elem[tween.prop] = tween.now)
				}
			}, jQuery.each(["toggle", "show", "hide"], function(i, name) {
				var cssFn = jQuery.fn[name];
				jQuery.fn[name] = function(speed, easing, callback) {
					return null == speed || "boolean" == typeof speed ? cssFn.apply(this, arguments) : this.animate(genFx(name, !0), speed, easing, callback)
				}
			}), jQuery.fn.extend({
				fadeTo: function(speed, to, easing, callback) {
					return this.filter(isHidden).css("opacity", 0).show().end().animate({
						opacity: to
					}, speed, easing, callback)
				},
				animate: function(prop, speed, easing, callback) {
					var empty = jQuery.isEmptyObject(prop),
						optall = jQuery.speed(speed, easing, callback),
						doAnimation = function() {
							var anim = Animation(this, jQuery.extend({}, prop), optall);
							doAnimation.finish = function() {
								anim.stop(!0)
							}, (empty || jQuery._data(this, "finish")) && anim.stop(!0)
						};
					return doAnimation.finish = doAnimation, empty || optall.queue === !1 ? this.each(doAnimation) : this.queue(optall.queue, doAnimation)
				},
				stop: function(type, clearQueue, gotoEnd) {
					var stopQueue = function(hooks) {
						var stop = hooks.stop;
						delete hooks.stop, stop(gotoEnd)
					};
					return "string" != typeof type && (gotoEnd = clearQueue, clearQueue = type, type = undefined), clearQueue && type !== !1 && this.queue(type || "fx", []), this.each(function() {
						var dequeue = !0,
							index = null != type && type + "queueHooks",
							timers = jQuery.timers,
							data = jQuery._data(this);
						if(index) data[index] && data[index].stop && stopQueue(data[index]);
						else
							for(index in data) data[index] && data[index].stop && rrun.test(index) && stopQueue(data[index]);
						for(index = timers.length; index--;) timers[index].elem !== this || null != type && timers[index].queue !== type || (timers[index].anim.stop(gotoEnd), dequeue = !1, timers.splice(index, 1));
						(dequeue || !gotoEnd) && jQuery.dequeue(this, type)
					})
				},
				finish: function(type) {
					return type !== !1 && (type = type || "fx"), this.each(function() {
						var index, data = jQuery._data(this),
							queue = data[type + "queue"],
							hooks = data[type + "queueHooks"],
							timers = jQuery.timers,
							length = queue ? queue.length : 0;
						for(data.finish = !0, jQuery.queue(this, type, []), hooks && hooks.cur && hooks.cur.finish && hooks.cur.finish.call(this), index = timers.length; index--;) timers[index].elem === this && timers[index].queue === type && (timers[index].anim.stop(!0), timers.splice(index, 1));
						for(index = 0; length > index; index++) queue[index] && queue[index].finish && queue[index].finish.call(this);
						delete data.finish
					})
				}
			}), jQuery.each({
				slideDown: genFx("show"),
				slideUp: genFx("hide"),
				slideToggle: genFx("toggle"),
				fadeIn: {
					opacity: "show"
				},
				fadeOut: {
					opacity: "hide"
				},
				fadeToggle: {
					opacity: "toggle"
				}
			}, function(name, props) {
				jQuery.fn[name] = function(speed, easing, callback) {
					return this.animate(props, speed, easing, callback)
				}
			}), jQuery.speed = function(speed, easing, fn) {
				var opt = speed && "object" == typeof speed ? jQuery.extend({}, speed) : {
					complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
					duration: speed,
					easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
				};
				return opt.duration = jQuery.fx.off ? 0 : "number" == typeof opt.duration ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default, (null == opt.queue || opt.queue === !0) && (opt.queue = "fx"), opt.old = opt.complete, opt.complete = function() {
					jQuery.isFunction(opt.old) && opt.old.call(this), opt.queue && jQuery.dequeue(this, opt.queue)
				}, opt
			}, jQuery.easing = {
				linear: function(p) {
					return p
				},
				swing: function(p) {
					return .5 - Math.cos(p * Math.PI) / 2
				}
			}, jQuery.timers = [], jQuery.fx = Tween.prototype.init, jQuery.fx.tick = function() {
				var timer, timers = jQuery.timers,
					i = 0;
				for(fxNow = jQuery.now(); i < timers.length; i++) timer = timers[i], timer() || timers[i] !== timer || timers.splice(i--, 1);
				timers.length || jQuery.fx.stop(), fxNow = undefined
			}, jQuery.fx.timer = function(timer) {
				timer() && jQuery.timers.push(timer) && jQuery.fx.start()
			}, jQuery.fx.interval = 13, jQuery.fx.start = function() {
				timerId || (timerId = setInterval(jQuery.fx.tick, jQuery.fx.interval))
			}, jQuery.fx.stop = function() {
				clearInterval(timerId), timerId = null
			}, jQuery.fx.speeds = {
				slow: 600,
				fast: 200,
				_default: 400
			}, jQuery.fx.step = {}, jQuery.expr && jQuery.expr.filters && (jQuery.expr.filters.animated = function(elem) {
				return jQuery.grep(jQuery.timers, function(fn) {
					return elem === fn.elem
				}).length
			}), jQuery.fn.offset = function(options) {
				if(arguments.length) return options === undefined ? this : this.each(function(i) {
					jQuery.offset.setOffset(this, options, i)
				});
				var docElem, win, box = {
						top: 0,
						left: 0
					},
					elem = this[0],
					doc = elem && elem.ownerDocument;
				if(doc) return docElem = doc.documentElement, jQuery.contains(docElem, elem) ? (typeof elem.getBoundingClientRect !== core_strundefined && (box = elem.getBoundingClientRect()), win = getWindow(doc), {
					top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
					left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
				}) : box
			}, jQuery.offset = {
				setOffset: function(elem, options, i) {
					var position = jQuery.css(elem, "position");
					"static" === position && (elem.style.position = "relative");
					var curTop, curLeft, curElem = jQuery(elem),
						curOffset = curElem.offset(),
						curCSSTop = jQuery.css(elem, "top"),
						curCSSLeft = jQuery.css(elem, "left"),
						calculatePosition = ("absolute" === position || "fixed" === position) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
						props = {},
						curPosition = {};
					calculatePosition ? (curPosition = curElem.position(), curTop = curPosition.top, curLeft = curPosition.left) : (curTop = parseFloat(curCSSTop) || 0, curLeft = parseFloat(curCSSLeft) || 0), jQuery.isFunction(options) && (options = options.call(elem, i, curOffset)), null != options.top && (props.top = options.top - curOffset.top + curTop), null != options.left && (props.left = options.left - curOffset.left + curLeft), "using" in options ? options.using.call(elem, props) : curElem.css(props)
				}
			}, jQuery.fn.extend({
				position: function() {
					if(this[0]) {
						var offsetParent, offset, parentOffset = {
								top: 0,
								left: 0
							},
							elem = this[0];
						return "fixed" === jQuery.css(elem, "position") ? offset = elem.getBoundingClientRect() : (offsetParent = this.offsetParent(), offset = this.offset(), jQuery.nodeName(offsetParent[0], "html") || (parentOffset = offsetParent.offset()), parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", !0), parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", !0)), {
							top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", !0),
							left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", !0)
						}
					}
				},
				offsetParent: function() {
					return this.map(function() {
						for(var offsetParent = this.offsetParent || document.documentElement; offsetParent && !jQuery.nodeName(offsetParent, "html") && "static" === jQuery.css(offsetParent, "position");) offsetParent = offsetParent.offsetParent;
						return offsetParent || document.documentElement
					})
				}
			}), jQuery.each({
				scrollLeft: "pageXOffset",
				scrollTop: "pageYOffset"
			}, function(method, prop) {
				var top = /Y/.test(prop);
				jQuery.fn[method] = function(val) {
					return jQuery.access(this, function(elem, method, val) {
						var win = getWindow(elem);
						return val === undefined ? win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method] : void(win ? win.scrollTo(top ? jQuery(win).scrollLeft() : val, top ? val : jQuery(win).scrollTop()) : elem[method] = val)
					}, method, val, arguments.length, null)
				}
			}), jQuery.each({
				Height: "height",
				Width: "width"
			}, function(name, type) {
				jQuery.each({
					padding: "inner" + name,
					content: type,
					"": "outer" + name
				}, function(defaultExtra, funcName) {
					jQuery.fn[funcName] = function(margin, value) {
						var chainable = arguments.length && (defaultExtra || "boolean" != typeof margin),
							extra = defaultExtra || (margin === !0 || value === !0 ? "margin" : "border");
						return jQuery.access(this, function(elem, type, value) {
							var doc;
							return jQuery.isWindow(elem) ? elem.document.documentElement["client" + name] : 9 === elem.nodeType ? (doc = elem.documentElement, Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name])) : value === undefined ? jQuery.css(elem, type, extra) : jQuery.style(elem, type, value, extra)
						}, type, chainable ? margin : undefined, chainable, null)
					}
				})
			}), window.jQuery = window.$ = jQuery, "function" == typeof define && define.amd && define.amd.jQuery && define("jquery", [], function() {
				return jQuery
			})
		}(window),
		function(factory) {
			"function" == typeof define && define.amd ? define("placeholder", ["jquery"], factory) : factory(jQuery)
		}(function($) {
			function args(elem) {
				var newAttrs = {},
					rinlinejQuery = /^jQuery\d+$/;
				return $.each(elem.attributes, function(i, attr) {
					attr.specified && !rinlinejQuery.test(attr.name) && (newAttrs[attr.name] = attr.value)
				}), newAttrs
			}

			function clearPlaceholder(event, value) {
				var input = this,
					$input = $(input);
				if(input.value == $input.attr("placeholder") && $input.hasClass("placeholder"))
					if($input.data("placeholder-password")) {
						if($input = $input.hide().nextAll('input[type="password"]:first').show().attr("id", $input.removeAttr("id").data("placeholder-id")), event === !0) return $input[0].value = value;
						$input.focus()
					} else input.value = "", $input.removeClass("placeholder"), input == safeActiveElement() && input.select()
			}

			function setPlaceholder() {
				var $replacement, input = this,
					$input = $(input),
					id = this.id;
				if("" === input.value) {
					if("password" === input.type) {
						if(!$input.data("placeholder-textinput")) {
							try {
								$replacement = $input.clone().attr({
									type: "text"
								})
							} catch(e) {
								$replacement = $("<input>").attr($.extend(args(this), {
									type: "text"
								}))
							}
							$replacement.removeAttr("name").data({
								"placeholder-password": $input,
								"placeholder-id": id
							}).bind("focus.placeholder", clearPlaceholder), $input.data({
								"placeholder-textinput": $replacement,
								"placeholder-id": id
							}).before($replacement)
						}
						$input = $input.removeAttr("id").hide().prevAll('input[type="text"]:first').attr("id", id).show()
					}
					$input.addClass("placeholder"), $input[0].value = $input.attr("placeholder")
				} else $input.removeClass("placeholder")
			}

			function safeActiveElement() {
				try {
					return document.activeElement
				} catch(exception) {}
			}
			var hooks, placeholder, isOperaMini = "[object OperaMini]" == Object.prototype.toString.call(window.operamini),
				isInputSupported = "placeholder" in document.createElement("input") && !isOperaMini,
				isTextareaSupported = "placeholder" in document.createElement("textarea") && !isOperaMini,
				valHooks = $.valHooks,
				propHooks = $.propHooks;
			isInputSupported && isTextareaSupported ? (placeholder = $.fn.placeholder = function() {
				return this
			}, placeholder.input = placeholder.textarea = !0) : (placeholder = $.fn.placeholder = function() {
				var $this = this;
				return $this.filter((isInputSupported ? "textarea" : ":input") + "[placeholder]").not(".placeholder").bind({
					"focus.placeholder": clearPlaceholder,
					"blur.placeholder": setPlaceholder
				}).data("placeholder-enabled", !0).trigger("blur.placeholder"), $this
			}, placeholder.input = isInputSupported, placeholder.textarea = isTextareaSupported, hooks = {
				get: function(element) {
					var $element = $(element),
						$passwordInput = $element.data("placeholder-password");
					return $passwordInput ? $passwordInput[0].value : $element.data("placeholder-enabled") && $element.hasClass("placeholder") ? "" : element.value
				},
				set: function(element, value) {
					var $element = $(element),
						$passwordInput = $element.data("placeholder-password");
					return $passwordInput ? $passwordInput[0].value = value : $element.data("placeholder-enabled") ? ("" === value ? (element.value = value, element != safeActiveElement() && setPlaceholder.call(element)) : $element.hasClass("placeholder") ? clearPlaceholder.call(element, !0, value) || (element.value = value) : element.value = value, $element) : element.value = value
				}
			}, isInputSupported || (valHooks.input = hooks, propHooks.value = hooks), isTextareaSupported || (valHooks.textarea = hooks, propHooks.value = hooks), $(function() {
				$(document).delegate("form", "submit.placeholder", function() {
					var $inputs = $(".placeholder", this).each(clearPlaceholder);
					setTimeout(function() {
						$inputs.each(setPlaceholder)
					}, 10)
				})
			}), $(window).bind("beforeunload.placeholder", function() {
				$(".placeholder").each(function() {
					this.value = ""
				})
			}))
		}), define("util/MD5", ["require", "exports", "module"], function(require, exports) {
			"use strict";

			function MD5() {
				var MD5_T = new Array(0, 3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745),
					MD5_round1 = new Array(new Array(0, 7, 1), new Array(1, 12, 2), new Array(2, 17, 3), new Array(3, 22, 4), new Array(4, 7, 5), new Array(5, 12, 6), new Array(6, 17, 7), new Array(7, 22, 8), new Array(8, 7, 9), new Array(9, 12, 10), new Array(10, 17, 11), new Array(11, 22, 12), new Array(12, 7, 13), new Array(13, 12, 14), new Array(14, 17, 15), new Array(15, 22, 16)),
					MD5_round2 = new Array(new Array(1, 5, 17), new Array(6, 9, 18), new Array(11, 14, 19), new Array(0, 20, 20), new Array(5, 5, 21), new Array(10, 9, 22), new Array(15, 14, 23), new Array(4, 20, 24), new Array(9, 5, 25), new Array(14, 9, 26), new Array(3, 14, 27), new Array(8, 20, 28), new Array(13, 5, 29), new Array(2, 9, 30), new Array(7, 14, 31), new Array(12, 20, 32)),
					MD5_round3 = new Array(new Array(5, 4, 33), new Array(8, 11, 34), new Array(11, 16, 35), new Array(14, 23, 36), new Array(1, 4, 37), new Array(4, 11, 38), new Array(7, 16, 39), new Array(10, 23, 40), new Array(13, 4, 41), new Array(0, 11, 42), new Array(3, 16, 43), new Array(6, 23, 44), new Array(9, 4, 45), new Array(12, 11, 46), new Array(15, 16, 47), new Array(2, 23, 48)),
					MD5_round4 = new Array(new Array(0, 6, 49), new Array(7, 10, 50), new Array(14, 15, 51), new Array(5, 21, 52), new Array(12, 6, 53), new Array(3, 10, 54), new Array(10, 15, 55), new Array(1, 21, 56), new Array(8, 6, 57), new Array(15, 10, 58), new Array(6, 15, 59), new Array(13, 21, 60), new Array(4, 6, 61), new Array(11, 10, 62), new Array(2, 15, 63), new Array(9, 21, 64)),
					MD5_F = function(x, y, z) {
						return x & y | ~x & z
					},
					MD5_G = function(x, y, z) {
						return x & z | y & ~z
					},
					MD5_H = function(x, y, z) {
						return x ^ y ^ z
					},
					MD5_I = function(x, y, z) {
						return y ^ (x | ~z)
					},
					MD5_round = new Array(new Array(MD5_F, MD5_round1), new Array(MD5_G, MD5_round2), new Array(MD5_H, MD5_round3), new Array(MD5_I, MD5_round4)),
					MD5_pack = function(n32) {
						return String.fromCharCode(255 & n32) + String.fromCharCode(n32 >>> 8 & 255) + String.fromCharCode(n32 >>> 16 & 255) + String.fromCharCode(n32 >>> 24 & 255)
					},
					MD5_number = function(n) {
						for(; 0 > n;) n += 4294967296;
						for(; n > 4294967295;) n -= 4294967296;
						return n
					},
					MD5_apply_round = function(x, s, f, abcd, r) {
						var a, b, c, d, kk, ss, ii, t, u;
						a = abcd[0], b = abcd[1], c = abcd[2], d = abcd[3], kk = r[0], ss = r[1], ii = r[2], u = f(s[b], s[c], s[d]), t = s[a] + u + x[kk] + MD5_T[ii], t = MD5_number(t), t = t << ss | t >>> 32 - ss, t += s[b], s[a] = MD5_number(t)
					},
					MD5_hash = function(data) {
						var abcd, x, state, s, len, index, padLen, f, r, i, j, k, tmp;
						if(state = new Array(1732584193, 4023233417, 2562383102, 271733878), len = data.length, index = 63 & len, padLen = 56 > index ? 56 - index : 120 - index, padLen > 0)
							for(data += "", i = 0; padLen - 1 > i; i++) data += "\x00";
						for(data += MD5_pack(8 * len), data += MD5_pack(0), len += padLen + 8, abcd = new Array(0, 1, 2, 3), x = new Array(16), s = new Array(4), k = 0; len > k; k += 64) {
							for(i = 0, j = k; 16 > i; i++, j += 4) x[i] = data.charCodeAt(j) | data.charCodeAt(j + 1) << 8 | data.charCodeAt(j + 2) << 16 | data.charCodeAt(j + 3) << 24;
							for(i = 0; 4 > i; i++) s[i] = state[i];
							for(i = 0; 4 > i; i++)
								for(f = MD5_round[i][0], r = MD5_round[i][1], j = 0; 16 > j; j++) MD5_apply_round(x, s, f, abcd, r[j]), tmp = abcd[0], abcd[0] = abcd[3], abcd[3] = abcd[2], abcd[2] = abcd[1], abcd[1] = tmp;
							for(i = 0; 4 > i; i++) state[i] += s[i], state[i] = MD5_number(state[i])
						}
						return MD5_pack(state[0]) + MD5_pack(state[1]) + MD5_pack(state[2]) + MD5_pack(state[3])
					};
				return function(data) {
					var i, out, c, bit128;
					for(bit128 = MD5_hash(data), out = "", i = 0; 16 > i; i++) c = bit128.charCodeAt(i), out += "0123456789abcdef".charAt(c >> 4 & 15), out += "0123456789abcdef".charAt(15 & c);
					return out
				}
			}
			exports.MD5 = MD5()
		}), define("util/Cookie", ["require", "exports", "module"], function(require, exports) {
			"use strict";

			function cookie(key, value, options) {
				var result = null;
				if(void 0 !== value && (null === value || "object" != typeof value)) {
					if(options = jQuery.extend({}, options), null === value && (options.expires = -1), "number" == typeof options.expires) {
						var days = options.expires,
							t = options.expires = new Date;
						t.setDate(t.getDate() + days)
					}
					return result = [encodeURIComponent(key), "=", options.raw ? String(value) : encodeURIComponent(String(value)), options.expires ? "; expires=" + options.expires.toUTCString() : "", options.path ? "; path=" + options.path : "", options.domain ? "; domain=" + options.domain : "", options.secure ? "; secure" : ""].join(""), document.cookie = result, result
				}
				options = value || {};
				var decode = function(s) {
					return s
				};
				return options.raw || (decode = decodeURIComponent), result = new RegExp("(?:^|; )" + encodeURIComponent(key) + "=([^;]*)").exec(document.cookie), result ? decode(result[1]) : null
			}
			exports.get = function(key) {
				return cookie(key)
			}, exports.set = cookie, exports.remove = function(key, options) {
				return cookie(key, null, options)
			}
		}), define("util/Path", ["require", "exports", "module"], function(require, exports) {
			"use strict";

			function parseUrl(url) {
				for(var parse_url = /^(?:([A-Za-z]+):(\/{0,3}))?([0-9.\-A-Za-z]+\.[0-9A-Za-z]+)?(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/, names = ["url", "scheme", "slash", "host", "port", "path", "query", "hash"], results = parse_url.exec(url), that = {}, i = 0, len = names.length; len > i; i += 1) that[names[i]] = results[i] || "";
				if(that.query) {
					var _params = ("?" + that.query).match(new RegExp("[?&][^?&]+=[^?&]+", "g"));
					that.query = {};
					for(var j = 0, count = _params.length; count > j; j++) {
						var arr = _params[j].split("=");
						that.query[arr[0].substring(1)] = arr[1]
					}
				}
				return that
			}
			exports.parseUrl = parseUrl
		}), define("util/NeteaseUrs", ["jquery", "util/MD5", "util/Cookie", "util/Path"], function($, MD5, Cookie, Path) {
			"use strict";
			var ErrorType = {
					411: "您的IP地址有异常登录行为",
					412: "您尝试的次数已经太多,请过一段时间再试",
					414: "您的IP登录失败次数过多,请稍后再试",
					415: "您今天登录错误次数已经太多,请明天再试",
					416: "您的IP今天登录过于频繁，请稍后再试",
					417: "您的IP今天登录次数过多，请明天再试",
					418: "您今天登录次数过多,请明天再试",
					419: "您的登录操作过于频繁，请稍候再试",
					420: "账号或密码错误",
					422: "账号被锁定，请您解锁后再登录!",
					428: "账号异常",
					460: "账号或密码错误",
					500: "系统繁忙，请您稍后再试！",
					503: "系统维护，请您稍后再试！",
					2062: "",
					2063: "",
					2064: "验证码错误"
				},
				authUrl = "/login/acc/urs/verify/check",
				defaultParams = {
					username: "",
					password: "",
					app: "web",
					product: "YNOTE",
					tp: "urstoken",
					cf: 2,
					fr: 1,
					systemName: "",
					deviceType: "",
					ru: "/loginCallback.html",
					er: "/loginCallback.html"
				};
			! function() {
				var p = window.location.protocol,
					h = window.location.host,
					pth = window.location.pathname.replace(/([^\/]*)$/, ""),
					urlp = [p, "//", h, pth];
				defaultParams.ru = urlp.join("") + defaultParams.ru, defaultParams.er = urlp.join("") + defaultParams.er
			}();
			var NeteaseLogin = function() {
				this.params = {}, this.success = null, this.error = null, this.start = null, this.end = null, this.iframe = null, this.form = null, this.username = null, this.password = null
			};
			NeteaseLogin.prototype = {
				init: function(conf) {
					return this.params = $.extend({}, defaultParams, conf.params), this.md5Password(), $.isFunction(conf.success) && (this.success = conf.success), $.isFunction(conf.error) && (this.error = conf.error), $.isFunction(conf.start) && (this.start = conf.start), $.isFunction(conf.end) && (this.end = conf.end), this
				},
				md5Password: function() {
					var pswd = this.params.password,
						username = this.params.username;
					if(0 !== pswd.length) {
						if(pswd.length > 16) {
							var domain = username.substring(username.lastIndexOf("@") + 1);
							"126.com" != domain && "vip.163.com" != domain && "188.com" != domain && (pswd = pswd.substring(0, 16))
						}
						this.params.password = MD5.MD5(pswd)
					}
				},
				changeUrsCookie: function(callback) {
					$.getJSON("/auth/urs/login.json?app=web", function(data) {
						$.isFunction(callback) && callback.call(this, data.login)
					}).fail(function(e) {
						callback.call(this, "error")
					})
				},
				check: function(callback) {
					var self = this;
					$.ajaxSetup({
						cache: !1
					}), $.get("/login/acc/pe/getsess?product=YNOTE").always(function() {
						$.getJSON("/auth/cq.json?app=web", function(data) {
							data.user && data.user.login && $.isFunction(callback) ? callback.call(this, !0) : data.user && !data.user.login && self.changeUrsCookie(callback)
						}).fail(function(e) {
							callback.call(this, "error")
						})
					}).fail(function(e) {
						500 != e.status && callback.call(this, "error")
					})
				},
				ajaxErrorHandle: function() {},
				getSystemName: function(ua) {
					var sys = "others";
					return -1 !== ua.indexOf("windows") ? sys = "Windows" : -1 !== ua.indexOf("mac") ? sys = "mac" : -1 !== ua.indexOf("linux") ? sys = "linux" : -1 !== ua.indexOf("android") ? sys = "Android" : (-1 !== ua.indexOf("iphone") || -1 !== ua.indexOf("ipad")) && (sys = "ios"), sys
				},
				getDeviceType: function(ua) {
					var dev = "others";
					return -1 !== ua.indexOf("windows") ? dev = "WindowsPC" : -1 !== ua.indexOf("mac") ? dev = "MacPC" : -1 !== ua.indexOf("linux") ? dev = "linuxPC" : -1 !== ua.indexOf("android") ? dev = "Android" : -1 !== ua.indexOf("iphone") ? dev = "iPhone" : -1 !== ua.indexOf("ipad") && (dev = "iPad"), dev
				},
				run: function() {
					if(null === this.iframe) {
						var uniqueString = "loginIframe";
						this.iframe = document.createElement("iframe"), document.body.appendChild(this.iframe), this.iframe.style.display = "none", this.iframe.contentWindow.name = uniqueString, this.form = document.createElement("form"), this.form.target = uniqueString, this.form.method = "POST", this.username = document.createElement("input"), this.username.type = "hidden", this.username.name = "username", this.form.appendChild(this.username), this.password = document.createElement("input"), this.password.type = "hidden", this.password.name = "password", this.form.appendChild(this.password), document.body.appendChild(this.form)
					}
					return $.isFunction(this.start) && this.start(), this.form.action = this.generateUrl(), this.username.value = this.params.username, this.password.value = this.params.password, this.form.submit(), this
				},
				generateUrl: function() {
					var key, ps = [],
						params = this.params;
					for(key in params) params.hasOwnProperty(key) && "username" !== key && "password" !== key && (ps[ps.length] = key + "=" + window.encodeURIComponent(this.params[key]));
					var userAgent = window.navigator.userAgent.toLowerCase();
					ps[ps.length] = "systemName=" + this.getSystemName(userAgent), ps[ps.length] = "deviceType=" + this.getDeviceType(userAgent), ps[ps.length] = "timestamp=" + (new Date).getTime();
					var url = "https://note.youdao.com" + authUrl;
					return url = url + "?" + ps.join("&")
				},
				callbackHandler: function(urlParams) {
					var domain = this.getDomain();
					$.isFunction(this.end) && this.end(), urlParams.ecode ? domain.length > 0 && $.isFunction(this.error) && ("2062" == urlParams.ecode && !urlParams.tpcode || "2063" == urlParams.ecode || "2064" == urlParams.ecode ? this.error.call(this, urlParams.ecode, ErrorType[urlParams.ecode]) : this.error.call(this, urlParams.ecode, ErrorType[urlParams.tpcode])) : $.isFunction(this.success) && this.success.call(this)
				},
				getDomain: function() {
					var domain = "",
						hostname = window.location.hostname;
					return -1 !== hostname.indexOf(".163.com") ? domain = ".163.com" : -1 !== hostname.indexOf(".youdao.com") && (domain = ".youdao.com"), domain
				}
			};
			var instance = null;
			return {
				getInstance: function() {
					return null === instance && (instance = new NeteaseLogin), instance
				}
			}
		}), define("util/Passport", ["require", "exports", "module"], function(require, exports) {
			"use strict";
			var initLoginHtml = function() {
				var usernamelist = document.createElement("div"),
					html = '<div id = "passportusernamelist" class="domainSelector"    style="display: none;"><table width="100%" cellspacing=0 cellpadding=0>       <tr><td class="title">请选择或继续输入...</td></tr>    <tr><td>&nbsp;</td></tr></table></div>';
				usernamelist.innerHTML = html, document.body.appendChild(usernamelist)
			};
			initLoginHtml(), String.prototype.trim = function() {
				return this.replace(/(^\s*)|(\s*_$)/g, "")
			}, String.prototype.endsWith = function(pattern) {
				var d = this.length - pattern.length;
				return d >= 0 && this.lastIndexOf(pattern) === d
			};
			var getElemXY = function(elem, parent) {
					for(var sumTop = 0, sumLeft = 0; elem && (sumLeft += elem.offsetLeft || 0, sumTop += elem.offsetTop || 0, elem = elem.offsetParent, !parent || parent !== elem););
					return {
						x: sumLeft,
						y: sumTop
					}
				},
				isIE = navigator && -1 != navigator.userAgent.toLowerCase().indexOf("msie"),
				Passport = function() {
					var _inputElem = null,
						_nameListElem = null,
						userAgent = window.navigator.userAgent,
						_isFirstTime = (userAgent && -1 !== userAgent.indexOf("iPad"), !0),
						_curSelIndex = -1,
						DOMAINS = ["163.com", "126.com", "yeah.net", "vip.163.com", "vip.126.com", "popo.163.com", "188.com", "qq.com", "sina.com", "gmail.com"],
						_domainSelElem = null,
						_$ = function(id) {
							return document.getElementById(id)
						},
						_checkEmailFinished = function() {
							for(var email = _inputElem.value.trim(), i = 0; i < DOMAINS.length; i++)
								if(email.endsWith(DOMAINS[i])) return !0;
							return !1
						},
						_keyupProc = function(event) {
							event = event || window.event;
							var keyCode = event.keyCode;
							if(Passport.suggestNames(), 13 == keyCode) {
								_checkEmailFinished() || _doSelect();
								var password = _$("pass") || _$("password");
								password && password.focus()
							} else Passport.suggestNames()
						},
						_keypressProc = function(event) {
							event = event || window.event;
							var keyCode = event.keyCode;
							return 13 == keyCode ? void _preventEvent(event) : (_isFirstTime && (_isFirstTime = !1), void(38 == keyCode || 40 == keyCode ? (_preventEvent(event), _setFocus(!0), _upSelectIndex(38 == keyCode), _setFocus(!1)) : (108 == keyCode || 110 == keyCode || 111 == keyCode || 115 == keyCode) && setTimeout("Passport.suggestNames()", 20)))
						},
						_setFocus = function(isClear) {
							var x = _findTdElement(_curSelIndex);
							if(x) try {
								x.style.backgroundColor = isClear ? "white" : "#D5F1FF"
							} catch(e) {}
						},
						_findTdElement = function(index) {
							try {
								for(var x = _nameListElem.firstChild.rows, i = 0; i < x.length; ++i)
									if(x[i].firstChild.idx == index) return x[i].firstChild
							} catch(e) {}
							return !1
						},
						_upSelectIndex = function(isUp) {
							var index = _curSelIndex;
							if(null != _nameListElem.firstChild) {
								var x = _nameListElem.firstChild.rows;
								if(0 != x.length) {
									var i;
									for(i = 0; i < x.length && x[i].firstChild.idx != index; ++i);
									_curSelIndex = isUp ? 0 == i ? x[x.length - 1].firstChild.idx : x[i - 1].firstChild.idx : i >= x.length - 1 ? x[0].firstChild.idx : x[i + 1].firstChild.idx
								}
							}
						},
						_doSelect = function() {
							if(_hide(_domainSelElem), "" != _inputElem.value.trim()) {
								var currentUsernameTd = _findTdElement(_curSelIndex);
								currentUsernameTd && (_inputElem.value = currentUsernameTd.innerHTML), _setFocus(!1)
							}
						},
						_handle = function() {
							_domainSelElem = _$("passportusernamelist"), _nameListElem = _domainSelElem.firstChild.rows[1].firstChild, _curSelIndex = 0, _inputElem.onclick = function() {}, _inputElem.onfocus = function() {
								try {
									window.showWarning1 && showWarning1(!1)
								} catch(e) {}
							};
							var password = _$("pass") || _$("password");
							if(password && (password.onfocus = function() {
									try {
										window.showWarning1 && showWarning1(!1)
									} catch(e) {}
								}), _inputElem.onblur = function() {
									var userInput = _inputElem.value.trim();
									if("" != userInput) {
										var pos;
										if((pos = userInput.indexOf("@")) < 0) var username = userInput,
											hostname = "";
										else var username = userInput.substr(0, pos),
											hostname = userInput.substr(pos + 1, userInput.length);
										if("" == hostname) return _inputElem.value = username + "@" + DOMAINS[_curSelIndex > 0 ? _curSelIndex : 0], void _hide(_domainSelElem);
										for(var i = 0; i < DOMAINS.length; ++i)
											if(hostname == DOMAINS[i]) return void _hide(_domainSelElem);
										_doSelect()
									}
								}, _inputElem.addEventListener) {
								var appVers = navigator.appVersion,
									keypress = appVers.match(/Konqueror|Safari|KHTML/) ? "keydown" : "keypress";
								_inputElem.addEventListener(keypress, _keypressProc, !1), _inputElem.addEventListener("keyup", _keyupProc, !1)
							} else _inputElem.attachEvent("onkeydown", _keypressProc), _inputElem.attachEvent("onkeyup", _keyupProc), window.attachEvent("onunload", function() {
								_inputElem = null, _nameListElem = null, _domainSelElem = null
							})
						},
						_preventEvent = function(event) {
							event.cancelBubble = !0, event.returnValue = !1, event.preventDefault && event.preventDefault(), event.stopPropagation && event.stopPropagation()
						},
						_hide = function(elem) {
							elem.style.display = "none"
						},
						_createElem = function(tagName) {
							return document.createElement(tagName)
						};
					return {
						bind: function(input) {
							_inputElem = input, _handle()
						},
						suggestNames: function() {
							var userInput = _inputElem.value.trim();
							if("" == userInput || -1 != userInput.indexOf("<") || -1 != userInput.indexOf(">")) return void _hide(_domainSelElem);
							var pos;
							if((pos = userInput.indexOf("@")) < 0) var username = userInput,
								hostname = "";
							else var username = userInput.substr(0, pos),
								hostname = userInput.substr(pos + 1, userInput.length);
							var usernames = [];
							if("" == hostname)
								for(var i = 0; i < DOMAINS.length; ++i) usernames.push(username + "@" + DOMAINS[i]);
							else
								for(var i = 0; i < DOMAINS.length; ++i) 0 == DOMAINS[i].indexOf(hostname) && usernames.push(username + "@" + DOMAINS[i]);
							if(0 == usernames.length) return _hide(_domainSelElem), void(_curSelIndex = -1);
							var xy = getElemXY(_inputElem, document.body),
								style = _domainSelElem.style;
							style.left = xy.x - (isIE ? 1 : 0) + "px", style.top = xy.y + _inputElem.offsetHeight - (isIE ? 1 : 0) + "px", style.width = _inputElem.offsetWidth - 2 + "px", style.zIndex = "2000", style.paddingRight = "0", style.paddingLeft = "0", style.paddingTop = "0", style.paddingBottom = "0", style.backgroundColor = "white", style.display = "block";
							var myTable = _createElem("TABLE");
							myTable.width = "100%", myTable.cellSpacing = 0, myTable.cellPadding = 3;
							var tbody = _createElem("TBODY");
							myTable.appendChild(tbody);
							for(var i = 0; i < usernames.length; ++i) {
								var tr = _createElem("TR"),
									td = _createElem("TD");
								td.nowrap = "true", td.align = "left", td.innerHTML = usernames[i], td.idx = i, td.onmouseover = function() {
									_setFocus(!0), _curSelIndex = this.idx, _setFocus(!1), this.style.cursor = "pointer"
								}, td.onmouseout = function() {}, td.onclick = function() {
									_doSelect()
								}, tr.appendChild(td), tbody.appendChild(tr)
							}
							_nameListElem.innerHTML = "", _nameListElem.appendChild(myTable), _setFocus()
						}
					}
				}();
			return Passport
		}), define("util/Params", [], function() {
			"use strict";

			function getParamByName(name) {
				name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
				var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
					results = regex.exec(location.search);
				return null == results ? "" : decodeURIComponent(results[1].replace(/\+/g, " "))
			}
			return {
				get: getParamByName
			}
		}), define("module/dialog", ["jquery"], function($) {
			"use strict";

			function closeDialog() {
				$d.hide()
			}
			var $d = $(".dialog").add(".shadow"),
				NULLFUNC = function() {};
			return {
				open: function(options) {
					var opt = {
						title: options.title || "",
						content: options.content || "",
						ok: options.ok || NULLFUNC,
						cancel: options.cancel || NULLFUNC,
						height: options.height || "auto",
						width: options.width || "420px",
						hideok: !!options.hideok,
						hidecancel: !!options.hidecancel
					};
					if(opt.title && opt.content) return $(".dialog").height(opt.height).width(opt.width), $d.find(".dtitle").text(opt.title), $d.find(".dialog-body").html(opt.content), $d.find(".btn.ok").off("click").toggle(!opt.hideok).on("click", function() {
						closeDialog(), opt.ok()
					}), $d.find(".btn.cancel").off("click").toggle(!opt.hidecancel).on("click", function() {
						closeDialog(), opt.cancel()
					}), $d.find(".dclose").off("click").on("click", function() {
						closeDialog(), opt.cancel()
					}), $d.show(), closeDialog
				}
			}
		}), define("module/ursphone", ["jquery", "./dialog", "util/Params"], function($, dialog, params) {
			function errorHint(message) {
				var iframeEl = $("#urs-phone-login iframe").get(0);
				dialog.open({
					title: "提示",
					content: message,
					hidecancel: !0,
					width: "300px",
					ok: function() {
						iframeEl.src = iframeEl.src
					},
					cancel: function() {
						iframeEl.src = iframeEl.src
					}
				})
			}

			function login(phoneNumber) {
				$.ajax({
					url: "/login/acc/cellphone",
					type: "POST",
					data: {
						method: "hasbound",
						product: "YNOTE",
						version: 2,
						cellphone: phoneNumber
					},
					success: function(data) {
						data && data.bound ? $.ajax({
							url: "/login/acc/login",
							type: "POST",
							data: {
								app: "web",
								tp: "cellphone",
								product: "YNOTE",
								cf: 2,
								show: !0,
								error: params.get("error") ? !0 : !1
							},
							success: function(res) {
								hookFunc()
							},
							error: function(e) {
								errorHint("登录失败，请重试。")
							}
						}) : errorHint("此手机号尚未绑定，请先使用其他方式登录")
					}
				})
			}
			var hookFunc = function() {};
			if(window.URS) {
				window.mylogin = login;
				new window.URS({
					product: "youdaonote",
					promark: "dvsFApU",
					version: 3,
					host: "note.youdao.com",
					productKey: "6ce0f0475b5d46acacf9b732d29218d8",
					isHttps: 1,
					cookieDomain: "youdao.com",
					regCookieDomain: "youdao.com",
					page: "login",
					logincb: function(phoneNumber) {
						login(phoneNumber)
					},
					includeBox: "urs-phone-login",
					skin: 4,
					mobileFirst: 1,
					uniteLogin: {
						isItl: 1,
						first: 1,
						clause: 1,
						needClause: 0,
						needUnLogin: 0,
						unLoginTime: 10,
						unLoginDefautl: 1,
						unLoginTxt: "十天内免登录",
						loginTxt: "登录",
						placeholders: {
							mob: "请输入手机号",
							cap: "请输入图片验证码",
							sms: "请输入短信验证码"
						}
					},
					needUnLogin: 0,
					defaultUnLogin: 1,
					needMobileLogin: 1,
					needMobileReg: 0,
					mobileFirst: 1,
					smsLoginFirst: 0,
					cssDomain: "https://shared.ydstatic.com/note/urs/",
					cssFiles: "ydoc_phone_v10.css",
					swidth: "310"
				})
			}
			return {
				setHook: function(loginComplete) {
					hookFunc = loginComplete
				}
			}
		}), define("module/login", ["util/NeteaseUrs", "util/Cookie", "util/Passport", "util/Path", "util/Params", "jquery", "placeholder", "module/dialog", "module/ursphone"], function(NeteaseUrs, cookie, Passport, Path, params, $, placeholder, dialog, usrphone) {
			"use strict";

			function loginComplete(isLogin) {
				isLogin && $.ajax({
					type: "GET",
					url: "/yws/mapi/user",
					data: {
						method: "get",
						multilevelEnable: !0
					},
					success: function() {
						exchangeCookie()
					},
					error: function(e) {
						loadingDom.addClass("loading error")
					}
				})
			}

			function exchangeCookie() {
				function checkAllHandled() {
					handledLength++, handledLength >= 3 && defer.resolve(trackEvent)
				}
				var handledLength = 0;
				$.when($.ajax({
					type: "POST",
					url: "/login/acc/se/cross/first",
					data: {
						product: "YNOTE"
					}
				}), $.ajax({
					type: "POST",
					url: "/login/acc/se/cross/first",
					data: {
						product: "YNOTE"
					}
				}), $.ajax({
					type: "POST",
					url: "/login/acc/se/cross/first",
					data: {
						product: "YNOTE"
					}
				})).then(function(data1, data2, data3) {
					try {
						var img = document.createElement("img");
						img.setAttribute("src", "//office.youdao.com/login/acc/cross/second?pci=" + data1[0].pci + "&ru=http://office.youdao.com"), img.style.display = "none", document.body.appendChild(img), img.addEventListener("load", function() {
							checkAllHandled()
						}), img.addEventListener("error", function() {
							checkAllHandled()
						});
						var img2 = document.createElement("img");
						img2.setAttribute("src", "//xueba.youdao.com/login/acc/cross/second?pci=" + data2[0].pci + "&ru=http://xueba.youdao.com"), img2.style.display = "none", document.body.appendChild(img2), img2.addEventListener("load", function() {
							checkAllHandled()
						}), img2.addEventListener("error", function() {
							checkAllHandled()
						});
						var img3 = document.createElement("img");
						img3.setAttribute("src", "//co.youdao.com/login/acc/cross/second?pci=" + data3[0].pci + "&ru=http://co.youdao.com"), img3.style.display = "none", document.body.appendChild(img3), img3.addEventListener("load", function() {
							checkAllHandled()
						}), img3.addEventListener("error", function() {
							checkAllHandled()
						})
					} catch(e) {
						defer.resolve(trackEvent)
					}
				}, function(e) {
					defer.resolve(trackEvent)
				})
			}

			function invitation() {
				inviteId && $.ajax({
					type: "POST",
					dataType: "json",
					url: "/yws/mapi/user?method=register&keyfrom=web&invitation=" + inviteId,
					cache: !1,
					success: function(data) {
						data = data || {}, data.error
					},
					error: function() {}
				})
			}

			function checkLogin() {
				netease.check(function(isLogin) {
					defer.notify(isLogin)
				})
			}

			function listenCookie() {
				return function(callback) {
					clearInterval(timer), timer = setInterval(function() {
						var isLogin = cookie.get("YNOTE_LOGIN");
						if("true" === isLogin && $.isFunction(callback)) callback(!0);
						else {
							var number = isLogin && isLogin.split("||")[0];
							number && (number = Number(number || 0), (1 & number || 2 & number) && $.isFunction(callback) && callback(!0))
						}
					}, 500)
				}
			}

			function login(e) {
				var isLoginReady = !0;
				return e.preventDefault(), isLoginReady && "" === $loginUser.val() && ($loginUser.focus(), isLoginReady = !1), isLoginReady && "" === $loginPwd.val() && ($loginPwd.focus(), isLoginReady = !1), isLoginReady ? isLoginReady && "" === $validateCode.val() && "none" != $verifyCode.css("display") ? ($validateCode.focus(), void $loginError.html("请输入验证码").show()) : (invitation(), void netease.init({
					params: {
						username: $.trim($loginUser.val()),
						password: $loginPwd.val(),
						cf: $loginCheckBox.prop("checked") ? 6 : 2,
						vcode: $validateCode.val()
					},
					start: function() {},
					end: function() {},
					success: function(username) {
						loginComplete(!0), trackEvent = "netease"
					},
					error: function(errorType, errorMsg, username) {
						var isVerifyCodeShow = !1;
						("2062" == errorType || "2063" == errorType || "2064" == errorType) && (isVerifyCodeShow = !0), isVerifyCodeShow && "" == $validateCode.val() ? $loginError.html("").show() : $loginError.html(errorMsg).show(), isVerifyCodeShow && (reloadVerifyCode(), showVerifyCode())
					}
				}).run()) : void $loginError.show()
			}

			function bindEvent() {
				Passport.bind($loginUser[0]), $loginSubmit.click(login), $loginForm.submit(function() {
					return !1
				}), $("[data-oauth]").click(function(evt) {
					function callback() {
						window.open(oauthUrl), listenCookie(function(isLogin) {
							loginComplete(isLogin)
						})
					}

					function kefu() {
						window.open("http://t.cn/Rc1NqCv")
					}
					evt.preventDefault();
					var $target = $(evt.currentTarget),
						oauthUrl = $target.data("oauth"),
						backUrl = encodeURIComponent(params.get("callback")),
						alertContent = $target.data("alert"),
						alertTitle = $target.data("alertTitle") || "告知";
					return trackEvent = $target.data("trackEvent") || "other", /MicroMessenger/i.test(navigator.userAgent) && backUrl && (oauthUrl += "&ru=" + backUrl), alertContent ? void dialog.open({
						title: alertTitle,
						content: alertContent,
						ok: kefu,
						cancel: function() {},
						hidecancel: !0
					}) : void callback()
				}), $(".more-btn").click(function() {
					"none" == $(".qqweb-huawei").css("display") ? ($(".qqweb-huawei").show(), $(".more-btn .arrow-line").addClass("rotate")) : ($(".qqweb-huawei").hide(), $(".more-btn .arrow-line").removeClass("rotate"))
				})
			}

			function showVerifyCode() {
				var pathname = window.location.pathname;
				"/signIn/docs.html" === pathname ? ($verifyCode.slideDown("fast"), $docsSubmit.animate({
					marginTop: "32px"
				}, "fast")) : ($accountInput.animate({
					marginBottom: "9px"
				}, "fast"), $passwordInput.animate({
					marginBottom: "6px"
				}, "fast"), $loginError.css("marginTop", "-46px"), $autoLoginRow.animate({
					marginBottom: "2px"
				}, "fast"), $verifyCode.show(), $('.login-container[data-container="netease"]').addClass("show-verify"))
			}

			function reloadVerifyCode() {
				var src = "/login/acc/urs/verify/get?product=YNOTE&width=80&height=32&rc=" + Math.random();
				$validateImage.attr("src", src), $validateCode.val(""), $validateCode.focus()
			}

			function listenReloadVerifyCode() {
				$reloadVCodeBtn.click(function(e) {
					e.preventDefault(), reloadVerifyCode()
				})
			}
			var netease = NeteaseUrs.getInstance(),
				$loginForm = $('[data-node="loginForm"]'),
				$loginUser = $('[data-node="loginUser"]'),
				$loginPwd = $('[data-node="loginPwd"]'),
				$loginCheckBox = $('[data-node="loginAuto"]'),
				$loginError = $('[data-node="loginError"]'),
				$verifyCode = $('[data-node="verifyCode"]'),
				$loginSubmit = $('[data-node="loginSubmit"]'),
				defer = $.Deferred(),
				inviteId = params.get("invitation"),
				from = params.get("from"),
				loadingDom = $(".loading"),
				$accountInput = $('[data-node="accountInput"]'),
				$passwordInput = $('[data-node="passwordInput"]'),
				$autoLoginRow = $('[data-node="autoLoginRow"]'),
				$validateCode = $('[data-node="validateCode"]'),
				$reloadVCodeBtn = $('[data-node="reloadVCodeBtn"]'),
				$validateImage = $('[data-node="validateImage"]'),
				$docsSubmit = $('[data-node="docsSubmit"]'),
				trackEvent = "other",
				timer = null;
			return function() {
				return window.netease = netease, checkLogin(), $("input").placeholder(), listenCookie = listenCookie(), listenReloadVerifyCode(), bindEvent(), "web" == from && listenCookie(loginComplete), usrphone.setHook(function() {
					listenCookie(loginComplete)
				}), defer.promise()
			}
		}), define("module/noteInvite", ["jquery"], function($) {
			"use strict";

			function noteInvite(code) {
				function onSuccess(info) {
					defer.notify(info)
				}

				function onInvalidCode() {
					defer.reject(code)
				}
				var defer = $.Deferred();
				return code ? ($.ajax({
					type: "GET",
					dataType: "json",
					url: "/yws/mapi/user?method=getinviter&keyfrom=web&invitation=" + code,
					cache: !1,
					success: onSuccess,
					error: onInvalidCode
				}), defer.promise()) : (defer.notify(null), defer.promise())
			}
			return noteInvite
		}), define("util/CallbackHandle", [], function() {
			"use strict";

			function onCallback(callback) {
				-1 !== callback.toLowerCase().indexOf("javascript:") || !/^http:\/\/.*/i.test(callback) && !/^https:\/\/.*/i.test(callback) ? (window.alert("对不起，系统检测到您的浏览器试图转向不安全的网站！我们将为您转向到笔记页面"), window.location.href = "http://note.youdao.com") : /^http(s)?:\/\/note.youdao.com\/.*/i.test(callback) || /^http(s)?:\/\/note\.youdao\.com$/i.test(callback) || /^http(s)?:\/\/office\.youdao\.com\/.*/i.test(callback) || /^http(s)?:\/\/office\.youdao\.com$/i.test(callback) || /^http(s)?:\/\/xueba\.youdao\.com\/.*/i.test(callback) || /^http(s)?:\/\/xueba\.youdao\.com$/i.test(callback) || /^http(s)?:\/\/co\.youdao\.com\/.*/i.test(callback) || /^http(s)?:\/\/co\.youdao\.com$/i.test(callback) || /^http(s)?:\/\/notesandbox\.youdao\.com\/.*/i.test(callback) || /^http(s)?:\/\/notesandbox\.youdao\.com$/i.test(callback) ? window.location.href = callback ? callback : "http://note.youdao.com/web" : window.location.href = "http://note.youdao.com"
			}
			return {
				onCallback: onCallback
			}
		})
}();